appfl-bio-suite 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- appfl_bio_suite-0.3.0/CITATION.cff +59 -0
- appfl_bio_suite-0.3.0/LICENSE +33 -0
- appfl_bio_suite-0.3.0/MANIFEST.in +5 -0
- appfl_bio_suite-0.3.0/PKG-INFO +349 -0
- appfl_bio_suite-0.3.0/README.md +244 -0
- appfl_bio_suite-0.3.0/constraints.txt +163 -0
- appfl_bio_suite-0.3.0/docs/partner/endpoint-setup.md +297 -0
- appfl_bio_suite-0.3.0/docs/partner/experiments/fine-mapping.md +234 -0
- appfl_bio_suite-0.3.0/docs/partner/experiments/flamby-heart-disease.md +166 -0
- appfl_bio_suite-0.3.0/docs/partner/experiments/gwas.md +124 -0
- appfl_bio_suite-0.3.0/docs/partner/experiments/methylation.md +10 -0
- appfl_bio_suite-0.3.0/docs/partner/onboarding.md +172 -0
- appfl_bio_suite-0.3.0/partners/templates/user_config_template.yaml.j2 +71 -0
- appfl_bio_suite-0.3.0/partners/templates/validate_mapping.py +120 -0
- appfl_bio_suite-0.3.0/pyproject.toml +241 -0
- appfl_bio_suite-0.3.0/requirements-multisusie.txt +2 -0
- appfl_bio_suite-0.3.0/setup.cfg +4 -0
- appfl_bio_suite-0.3.0/setup.py +20 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/__init__.py +78 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/cli.py +1435 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/__init__.py +0 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/compat.py +217 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/config.py +972 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/__init__.py +14 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/globus_compute_driver.py +228 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/serial_driver.py +168 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/tes_driver.py +306 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/endpoint.py +280 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/experiments.py +319 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/__init__.py +70 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/data/duo.json +399 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/drs.py +805 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/duo.py +762 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/resolve.py +282 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/tes.py +456 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/trs.py +772 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/identity.py +273 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/join.py +214 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/launch.py +638 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/loopback.py +336 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/onboarding.py +669 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/onboarding_cli.py +174 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/partner.py +410 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/plot_assets/argonne-palette.css +206 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/plot_style.py +92 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/preflight.py +961 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/simulation.py +412 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/site_credentials.py +171 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/site_trial.py +198 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch.py +849 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/THIRD_PARTY.md +39 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/globe.js +489 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/land.js +2 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/results.js +162 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/suite-logo.png +0 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/vendor.js +2 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/viewer.css +372 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/viewer.js +601 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_catalog.py +209 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/__init__.py +0 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/__init__.py +59 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/aggregator.py +860 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/arms.py +787 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/backend_outputs.py +124 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/composition.py +675 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/clients.template.yaml +37 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/server.loopback.yaml +77 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/server.yaml +108 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/simulation/ci-tiny.yaml +188 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/simulation/three-site-hapnest.yaml +195 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/dataset.py +777 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/UPSTREAM.json +40 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/__init__.py +18 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/fed_fine_mapping.py +1096 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/fine_mapping.py +739 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/locus_selection.py +696 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/phenotype_sim.py +870 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/qc.py +357 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/sampling.py +300 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/utils.py +601 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/validation.py +731 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/__init__.py +16 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/detail.py +453 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/eda.py +974 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/federation.py +1055 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/figstyle.py +526 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/paper_plots.py +1954 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/render.py +201 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/inference.py +258 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/matched_comparison.py +526 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie.py +245 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_batch.py +259 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_compare.py +328 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_experiment.py +137 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_pipeline.py +508 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/plotting.py +104 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/reporting.py +271 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/rerun.py +408 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/secure_aggregation.py +74 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/__init__.py +399 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/bundler.py +227 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/cohort.py +299 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/schema.py +393 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/stages.py +232 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/site_stage.py +260 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/trainer.py +798 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/__init__.py +8 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/clients.template.yaml +32 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/server.fedcompass.yaml +92 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/server.loopback.yaml +57 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/server.yaml +80 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/dataset.py +100 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/model.py +61 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/__init__.py +17 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/aggregator.py +312 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/clients.template.yaml +30 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/server.loopback.yaml +42 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/server.yaml +48 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/ci-tiny.yaml +28 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/published-five-site.yaml +53 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/three-site-skewed.yaml +24 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/two-site-balanced.yaml +24 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/dataset.py +109 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/plotting.py +143 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/__init__.py +310 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/bundler.py +252 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/cohort.py +303 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/phenotypes.py +429 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/schema.py +205 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/trainer.py +575 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/__init__.py +4 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/__main__.py +68 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/ci-tiny.yaml +13 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/poc.yaml +13 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/stress.yaml +19 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/tcga-laml.yaml +13 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/uneven-curves.yaml +39 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/uneven.yaml +36 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/dataset.py +155 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/evaluation.py +55 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/figures.py +806 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/gdc.py +234 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/model.py +32 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/pipeline.py +479 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/preprocessing.py +152 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/reporting.py +122 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/runner.py +25 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/simulation.py +85 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/stress.py +95 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/PKG-INFO +349 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/SOURCES.txt +200 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/dependency_links.txt +1 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/entry_points.txt +2 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/requires.txt +63 -0
- appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/top_level.txt +1 -0
- appfl_bio_suite-0.3.0/tests/test_configs.py +262 -0
- appfl_bio_suite-0.3.0/tests/test_docs.py +380 -0
- appfl_bio_suite-0.3.0/tests/test_endpoint_smoke.py +92 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_appfl_parity.py +240 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_centralized.py +214 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_composition.py +644 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_configs.py +305 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_federated.py +890 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_harmonization.py +99 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_locus_selection.py +165 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_multisusie.py +447 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_multisusie_appfl.py +274 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_multisusie_recovery.py +243 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_phenotypes.py +280 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_sampling.py +92 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_scientific.py +535 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_secure_aggregation.py +187 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_secure_backends.py +90 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_shipped_parity.py +468 -0
- appfl_bio_suite-0.3.0/tests/test_fine_mapping_utils.py +222 -0
- appfl_bio_suite-0.3.0/tests/test_flamby_parity.py +228 -0
- appfl_bio_suite-0.3.0/tests/test_ga4gh_drs.py +336 -0
- appfl_bio_suite-0.3.0/tests/test_ga4gh_duo.py +311 -0
- appfl_bio_suite-0.3.0/tests/test_ga4gh_enforcement.py +392 -0
- appfl_bio_suite-0.3.0/tests/test_ga4gh_shipped_parity.py +175 -0
- appfl_bio_suite-0.3.0/tests/test_ga4gh_trs_tes.py +485 -0
- appfl_bio_suite-0.3.0/tests/test_globus_service_account_probe.py +110 -0
- appfl_bio_suite-0.3.0/tests/test_gwas_loader_contract.py +106 -0
- appfl_bio_suite-0.3.0/tests/test_gwas_meta_analysis.py +102 -0
- appfl_bio_suite-0.3.0/tests/test_gwas_simulation_parity.py +248 -0
- appfl_bio_suite-0.3.0/tests/test_launch_and_loopback.py +161 -0
- appfl_bio_suite-0.3.0/tests/test_matched_comparison.py +76 -0
- appfl_bio_suite-0.3.0/tests/test_methylation.py +558 -0
- appfl_bio_suite-0.3.0/tests/test_methylation_gdc.py +143 -0
- appfl_bio_suite-0.3.0/tests/test_multisusie_parallel.py +38 -0
- appfl_bio_suite-0.3.0/tests/test_onboarding.py +657 -0
- appfl_bio_suite-0.3.0/tests/test_package_data.py +94 -0
- appfl_bio_suite-0.3.0/tests/test_preflight.py +129 -0
- appfl_bio_suite-0.3.0/tests/test_second_federation.py +181 -0
- appfl_bio_suite-0.3.0/tests/test_shipped_modules.py +283 -0
- appfl_bio_suite-0.3.0/tests/test_simulation_provenance.py +252 -0
- appfl_bio_suite-0.3.0/tests/test_site_credentials.py +287 -0
- appfl_bio_suite-0.3.0/tests/test_upstream_shim.py +110 -0
- appfl_bio_suite-0.3.0/tests/test_vendored_path.py +63 -0
- appfl_bio_suite-0.3.0/tests/test_version_is_consistent.py +44 -0
- appfl_bio_suite-0.3.0/tests/test_watch.py +648 -0
- appfl_bio_suite-0.3.0/tests/test_watch_catalog.py +141 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it as below."
|
|
3
|
+
title: "appfl-bio-suite: cross-silo federated learning experiments in computational biology"
|
|
4
|
+
abstract: >-
|
|
5
|
+
A downstream extension package for APPFL that packages federated learning
|
|
6
|
+
experiments in computational biology -- a FLamby Fed-Heart-Disease benchmark, a
|
|
7
|
+
federated GWAS with polygenic-score evaluation, federated cross-ancestry
|
|
8
|
+
fine-mapping governed by the GA4GH DUO, DRS, TRS and TES specifications, and a
|
|
9
|
+
work-in-progress federated DNA-methylation subtype classifier simulated on one
|
|
10
|
+
machine -- together with the operational tooling, partner-onboarding workflow,
|
|
11
|
+
federation network map, and reproducible data-simulation pipeline needed to run
|
|
12
|
+
them across independently administered HPC centers over Globus Compute.
|
|
13
|
+
type: software
|
|
14
|
+
license: MIT
|
|
15
|
+
version: 0.3.0
|
|
16
|
+
|
|
17
|
+
# TODO: add ORCID for each author, and any co-authors from the partner sites who should
|
|
18
|
+
# be credited.
|
|
19
|
+
authors:
|
|
20
|
+
- family-names: "Joel"
|
|
21
|
+
given-names: "Matthew"
|
|
22
|
+
affiliation: "Madduri Lab, Argonne National Laboratory"
|
|
23
|
+
|
|
24
|
+
keywords:
|
|
25
|
+
- federated learning
|
|
26
|
+
- genome-wide association study
|
|
27
|
+
- statistical fine-mapping
|
|
28
|
+
- DNA methylation
|
|
29
|
+
- GA4GH
|
|
30
|
+
- polygenic risk score
|
|
31
|
+
- differential privacy
|
|
32
|
+
- Globus Compute
|
|
33
|
+
- APPFL
|
|
34
|
+
- reproducible research
|
|
35
|
+
|
|
36
|
+
references:
|
|
37
|
+
- type: article
|
|
38
|
+
title: >-
|
|
39
|
+
Simulation Benchmarking of Differential Privacy and Federated Learning for
|
|
40
|
+
Secure Genetic Analysis and Polygenic Risk Scoring
|
|
41
|
+
authors:
|
|
42
|
+
- family-names: "Joel"
|
|
43
|
+
given-names: "Matthew"
|
|
44
|
+
notes: >-
|
|
45
|
+
The GWAS experiment reproduces this paper's simulation design. See
|
|
46
|
+
docs/experiments/gwas/ABOUT.md, and read docs/experiments/gwas/DATA.md for the
|
|
47
|
+
documented limits on reproducing the published figures from this repository alone.
|
|
48
|
+
|
|
49
|
+
- type: software
|
|
50
|
+
title: "APPFL: An open-source package for privacy-preserving federated learning"
|
|
51
|
+
repository-code: "https://github.com/APPFL/APPFL"
|
|
52
|
+
license: MIT
|
|
53
|
+
|
|
54
|
+
- type: article
|
|
55
|
+
title: >-
|
|
56
|
+
FLamby: Datasets and Benchmarks for Cross-Silo Federated Learning in Realistic
|
|
57
|
+
Healthcare Settings
|
|
58
|
+
year: 2022
|
|
59
|
+
notes: "NeurIPS 2022 Datasets and Benchmarks track. https://arxiv.org/abs/2210.04620"
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 appfl-bio-suite contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
This project depends on, but does not include, third-party software and data
|
|
26
|
+
with their own licenses:
|
|
27
|
+
|
|
28
|
+
* APPFL -- MIT License. https://github.com/APPFL/APPFL
|
|
29
|
+
* FLamby -- MIT License. https://github.com/owkin/FLamby
|
|
30
|
+
FLamby ships no data. Each of its datasets requires accepting the license on
|
|
31
|
+
the original host. The Fed-Heart-Disease data derives from the UCI Heart
|
|
32
|
+
Disease dataset (CC BY 4.0); attribute the original authors.
|
|
33
|
+
* PGS Catalog scoring files -- see https://www.pgscatalog.org/about/ for terms.
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: appfl-bio-suite
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Cross-silo federated learning experiments in computational biology, built on APPFL and Globus Compute
|
|
5
|
+
License: MIT License
|
|
6
|
+
|
|
7
|
+
Copyright (c) 2026 appfl-bio-suite contributors
|
|
8
|
+
|
|
9
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
10
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
11
|
+
in the Software without restriction, including without limitation the rights
|
|
12
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
13
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
14
|
+
furnished to do so, subject to the following conditions:
|
|
15
|
+
|
|
16
|
+
The above copyright notice and this permission notice shall be included in all
|
|
17
|
+
copies or substantial portions of the Software.
|
|
18
|
+
|
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
22
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
23
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
24
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
25
|
+
SOFTWARE.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
This project depends on, but does not include, third-party software and data
|
|
30
|
+
with their own licenses:
|
|
31
|
+
|
|
32
|
+
* APPFL -- MIT License. https://github.com/APPFL/APPFL
|
|
33
|
+
* FLamby -- MIT License. https://github.com/owkin/FLamby
|
|
34
|
+
FLamby ships no data. Each of its datasets requires accepting the license on
|
|
35
|
+
the original host. The Fed-Heart-Disease data derives from the UCI Heart
|
|
36
|
+
Disease dataset (CC BY 4.0); attribute the original authors.
|
|
37
|
+
* PGS Catalog scoring files -- see https://www.pgscatalog.org/about/ for terms.
|
|
38
|
+
|
|
39
|
+
Project-URL: Homepage, https://github.com/mfjoel01/appfl-bio-suite
|
|
40
|
+
Project-URL: Repository, https://github.com/mfjoel01/appfl-bio-suite
|
|
41
|
+
Project-URL: Documentation, https://github.com/mfjoel01/appfl-bio-suite/tree/main/docs
|
|
42
|
+
Keywords: federated-learning,globus-compute,appfl,gwas,polygenic-score,fine-mapping,susiex,flamby,dna-methylation
|
|
43
|
+
Classifier: Development Status :: 3 - Alpha
|
|
44
|
+
Classifier: Intended Audience :: Science/Research
|
|
45
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
46
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
47
|
+
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
48
|
+
Requires-Python: <3.13,>=3.12
|
|
49
|
+
Description-Content-Type: text/markdown
|
|
50
|
+
License-File: LICENSE
|
|
51
|
+
Requires-Dist: appfl==1.10.0
|
|
52
|
+
Requires-Dist: globus-compute-sdk==4.9.0
|
|
53
|
+
Requires-Dist: globus-compute-endpoint==4.9.0
|
|
54
|
+
Requires-Dist: globus-sdk==4.4.1
|
|
55
|
+
Requires-Dist: globus-identity-mapping==0.5.0
|
|
56
|
+
Requires-Dist: click==8.1.8
|
|
57
|
+
Requires-Dist: PyYAML>=6.0
|
|
58
|
+
Requires-Dist: pydantic<3,>=2.7
|
|
59
|
+
Requires-Dist: Jinja2<4,>=3.1
|
|
60
|
+
Requires-Dist: numpy==1.26.4
|
|
61
|
+
Requires-Dist: torch==2.8.0
|
|
62
|
+
Provides-Extra: flamby
|
|
63
|
+
Requires-Dist: pandas==2.2.2; extra == "flamby"
|
|
64
|
+
Requires-Dist: scikit-learn==1.7.2; extra == "flamby"
|
|
65
|
+
Requires-Dist: tqdm==4.67.1; extra == "flamby"
|
|
66
|
+
Requires-Dist: wget; extra == "flamby"
|
|
67
|
+
Provides-Extra: gwas
|
|
68
|
+
Requires-Dist: pandas==2.2.2; extra == "gwas"
|
|
69
|
+
Requires-Dist: scipy==1.16.2; extra == "gwas"
|
|
70
|
+
Requires-Dist: scikit-learn==1.7.2; extra == "gwas"
|
|
71
|
+
Requires-Dist: pandas-plink==2.3.2; extra == "gwas"
|
|
72
|
+
Provides-Extra: gwas-sim
|
|
73
|
+
Requires-Dist: appfl-bio-suite[gwas]; extra == "gwas-sim"
|
|
74
|
+
Requires-Dist: xarray==2025.9.1; extra == "gwas-sim"
|
|
75
|
+
Requires-Dist: dask==2024.9.0; extra == "gwas-sim"
|
|
76
|
+
Requires-Dist: matplotlib==3.10.6; extra == "gwas-sim"
|
|
77
|
+
Provides-Extra: finemapping
|
|
78
|
+
Requires-Dist: pandas==2.2.2; extra == "finemapping"
|
|
79
|
+
Requires-Dist: scipy==1.16.2; extra == "finemapping"
|
|
80
|
+
Provides-Extra: finemapping-sim
|
|
81
|
+
Requires-Dist: appfl-bio-suite[finemapping]; extra == "finemapping-sim"
|
|
82
|
+
Requires-Dist: joblib==1.4.2; extra == "finemapping-sim"
|
|
83
|
+
Requires-Dist: matplotlib==3.10.6; extra == "finemapping-sim"
|
|
84
|
+
Requires-Dist: Jinja2<4,>=3.1; extra == "finemapping-sim"
|
|
85
|
+
Provides-Extra: multisusie
|
|
86
|
+
Requires-Dist: appfl-bio-suite[finemapping-sim]; extra == "multisusie"
|
|
87
|
+
Provides-Extra: methylation
|
|
88
|
+
Requires-Dist: scikit-learn==1.7.2; extra == "methylation"
|
|
89
|
+
Requires-Dist: matplotlib==3.10.6; extra == "methylation"
|
|
90
|
+
Provides-Extra: watch
|
|
91
|
+
Requires-Dist: hivewatch==0.2.1; extra == "watch"
|
|
92
|
+
Provides-Extra: dev
|
|
93
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
94
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
95
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
96
|
+
Provides-Extra: all
|
|
97
|
+
Requires-Dist: appfl-bio-suite[flamby]; extra == "all"
|
|
98
|
+
Requires-Dist: appfl-bio-suite[gwas]; extra == "all"
|
|
99
|
+
Requires-Dist: appfl-bio-suite[gwas-sim]; extra == "all"
|
|
100
|
+
Requires-Dist: appfl-bio-suite[finemapping]; extra == "all"
|
|
101
|
+
Requires-Dist: appfl-bio-suite[finemapping-sim]; extra == "all"
|
|
102
|
+
Requires-Dist: appfl-bio-suite[watch]; extra == "all"
|
|
103
|
+
Requires-Dist: appfl-bio-suite[methylation]; extra == "all"
|
|
104
|
+
Dynamic: license-file
|
|
105
|
+
|
|
106
|
+
# appfl-bio-suite
|
|
107
|
+
|
|
108
|
+
Cross-silo **federated learning experiments in computational biology**, built on
|
|
109
|
+
[APPFL](https://github.com/APPFL/APPFL),
|
|
110
|
+
[hivewatch](https://github.com/APPFL/hivewatch) and
|
|
111
|
+
[Globus Compute](https://www.globus.org/compute).
|
|
112
|
+
|
|
113
|
+
Institutions train on their own data, on their own hardware, and return only results.
|
|
114
|
+
The standard multi-user deployment uses individual identities, with no shared credential,
|
|
115
|
+
VPN, or inbound network access.
|
|
116
|
+
|
|
117
|
+
> **Experimental: single-user service-account onboarding.** An opt-in prototype uses one service
|
|
118
|
+
> identity per site, with credentials held by that site and the coordinator. It is not
|
|
119
|
+
> yet the default or a production-ready replacement for multi-user endpoints.
|
|
120
|
+
> See the [trial guide](docs/coordinator/service-account-trial.md) and
|
|
121
|
+
> [design evaluation](docs/coordinator/endpoint-sharing-evaluation.md).
|
|
122
|
+
|
|
123
|
+
**→ [mfjoel01.github.io/appfl-bio-suite](https://mfjoel01.github.io/appfl-bio-suite/)** —
|
|
124
|
+
the project site, with a live preview of the [federation network
|
|
125
|
+
map](https://mfjoel01.github.io/appfl-bio-suite/network.html).
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
YOU (coordinator) PARTNER SITES
|
|
129
|
+
┌──────────────┐
|
|
130
|
+
│ driver │ ──── task ────► their cluster, their data
|
|
131
|
+
│ aggregator │ ◄─── result ─── (weights, or summary statistics)
|
|
132
|
+
└──────────────┘
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## The experiments
|
|
138
|
+
|
|
139
|
+
Fine-mapping also has a completed optional
|
|
140
|
+
[MultiSuSiE coordinator pipeline](docs/experiments/fine-mapping/MULTISUSIE.md) and
|
|
141
|
+
[matched-filter comparison against SuSiEx](docs/experiments/fine-mapping/MATCHED_RESULTS.md).
|
|
142
|
+
Use `run fine-mapping --backend susiex` or `--backend multisusie` with either the
|
|
143
|
+
local or remote driver; `--results-dir` keeps their outputs separate.
|
|
144
|
+
The [comparison report and figures](docs/experiments/fine-mapping/COMPARISON_FIGURES.md)
|
|
145
|
+
cover both methods across cohorts and filter policies.
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
Four experiments, one toolchain. The first three dispatch to partner sites; the fourth is
|
|
149
|
+
in development.
|
|
150
|
+
|
|
151
|
+
| | What it is | Data |
|
|
152
|
+
| --- | --- | --- |
|
|
153
|
+
| **[FLamby Fed-Heart-Disease](docs/experiments/flamby-heart-disease/ABOUT.md)** | Multi-round FedAvg on a public tabular benchmark with natural hospital splits | Partners download it; ~40 KB, CC BY 4.0 |
|
|
154
|
+
| **[Federated GWAS](docs/experiments/gwas/ABOUT.md)** | Single-round summary-statistic meta-analysis with polygenic-score evaluation | Simulated and distributed by the coordinator |
|
|
155
|
+
| **[Federated fine-mapping](docs/experiments/fine-mapping/ABOUT.md)** | Single-round cross-ancestry credible-set construction from per-site second moments — provably equal to a pooled fit, not an approximation of one. Governed by [GA4GH DUO, DRS, TRS and TES](docs/coordinator/ga4gh.md) | Simulated and distributed by the coordinator |
|
|
156
|
+
| **[Federated methylation](docs/experiments/methylation/ABOUT.md)** · *work in progress* | Multi-round FedAvg for methylation-based subtype classification on sparse, nanopore-like input, against pooled and local-only training. Currently a single-machine simulation | Synthetic, or open TCGA-LAML methylation data from the NCI GDC |
|
|
157
|
+
|
|
158
|
+
**Federated methylation is a work in progress.** All of its sites are simulated in one
|
|
159
|
+
process today, so there is no partner bundle or endpoint for it yet. Its results so far,
|
|
160
|
+
including one real-data run, are recorded as measured in its
|
|
161
|
+
[record of runs](docs/experiments/methylation/ABOUT.md#record-of-runs).
|
|
162
|
+
|
|
163
|
+
## Quickstart
|
|
164
|
+
|
|
165
|
+
Python 3.12 is required. Install the released package from PyPI:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
python -m pip install "appfl-bio-suite[all]==0.3.0"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
For coordinator scripts, example federation files, and the pinned constraints, use
|
|
172
|
+
the matching source checkout:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
git clone --branch v0.3.0 https://github.com/mfjoel01/appfl-bio-suite.git
|
|
176
|
+
cd appfl-bio-suite
|
|
177
|
+
python -m venv .venv && source .venv/bin/activate
|
|
178
|
+
pip install -e ".[all]" -c constraints.txt
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Prove the install works — a complete federation on one machine, no partners, no network,
|
|
182
|
+
and nothing to fill in first:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
appfl-bio-suite simulate gwas --scenario ci-tiny --out /tmp/gwas-ci
|
|
186
|
+
appfl-bio-suite run gwas --config loopback --driver serial --data-root /tmp/gwas-ci
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Results land in `local/output/gwas-loopback/`. This is the same pair of commands CI runs.
|
|
190
|
+
|
|
191
|
+
Then stand up a real federation:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
cp federation.yaml.example local/federation.yaml
|
|
195
|
+
$EDITOR local/federation.yaml
|
|
196
|
+
appfl-bio-suite preflight
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**→ [docs/coordinator/new-federation.md](docs/coordinator/new-federation.md)** takes you
|
|
200
|
+
from here to a running experiment across institutions you recruit yourself.
|
|
201
|
+
|
|
202
|
+
## The CLI
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
appfl-bio-suite preflight [--experiment X] environment, pins, configs, endpoints
|
|
206
|
+
appfl-bio-suite endpoint status [SITE] is it online
|
|
207
|
+
appfl-bio-suite endpoint smoke [SITE] round-trip: does it actually work
|
|
208
|
+
appfl-bio-suite identity validate <mapping.json> catch mapping bugs offline, in a second
|
|
209
|
+
appfl-bio-suite simulate EXPERIMENT --scenario NAME generate and split synthetic data
|
|
210
|
+
appfl-bio-suite run EXPERIMENT run it
|
|
211
|
+
appfl-bio-suite partner-bundle EXPERIMENT --site X a partner's complete setup package
|
|
212
|
+
appfl-bio-suite watch build | serve | export the federation, on a map
|
|
213
|
+
appfl-bio-suite ga4gh duo | drs | trs | tes data use, data objects, tools, tasks
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## How it works
|
|
219
|
+
|
|
220
|
+
**One config file.** `federation.yaml` declares who you are, who your partners are, and
|
|
221
|
+
what each is doing. Every generator, config, document template and check reads from it.
|
|
222
|
+
Nothing in `src/` contains a coordinator identity, an endpoint UUID, or a site name, and
|
|
223
|
+
CI verifies that.
|
|
224
|
+
|
|
225
|
+
**Generated partner bundles, not templates.** `partner-bundle` emits a directory with a
|
|
226
|
+
partner's configuration fully resolved — their site ID, their data assignment, *your*
|
|
227
|
+
identity, their scheduler's provider block — plus their two setup documents with no
|
|
228
|
+
placeholders left to interpret.
|
|
229
|
+
|
|
230
|
+
**A closed set for partner-facing content.** Bundles are built from `docs/partner/` and
|
|
231
|
+
nowhere else, enforced in code, so nothing outside that tree can reach a partner.
|
|
232
|
+
|
|
233
|
+
**Exact version pinning.** Every site runs byte-identical versions of the Globus Compute
|
|
234
|
+
stack. Skew does not fail at install time; it fails as a deserialization error several
|
|
235
|
+
rounds into a run on somebody else's cluster. `constraints.txt` pins it and
|
|
236
|
+
`preflight --check pins` verifies it.
|
|
237
|
+
|
|
238
|
+
**Failures that name the fix.** The
|
|
239
|
+
[troubleshooting registry](docs/coordinator/troubleshooting.md) is indexed by symptom and
|
|
240
|
+
gives the mechanism alongside the fix.
|
|
241
|
+
|
|
242
|
+
## GA4GH standards
|
|
243
|
+
|
|
244
|
+
The fine-mapping experiment is assembled out of four GA4GH specifications, each closing a
|
|
245
|
+
hole the design otherwise had.
|
|
246
|
+
|
|
247
|
+
| | | answers |
|
|
248
|
+
| --- | --- | --- |
|
|
249
|
+
| **DUO** | Data Use Ontology | May this site's data be used for this study? |
|
|
250
|
+
| **DRS** | Data Repository Service | Exactly which bytes did a site compute over? |
|
|
251
|
+
| **TRS** | Tool Registry Service | Exactly which tool version computed them? |
|
|
252
|
+
| **TES** | Task Execution Service | Run that tool, there, on those bytes. |
|
|
253
|
+
|
|
254
|
+
Together: *a named tool version, pinned by checksum, runs over content-addressed data
|
|
255
|
+
whose use terms permit the study that dispatched it.* Every clause of that sentence used
|
|
256
|
+
to be an assumption.
|
|
257
|
+
|
|
258
|
+
**A site enforces its own consent code.** Each bundle carries a `DATA_USE.json`, and the
|
|
259
|
+
site's worker matches it against the study the coordinator declared — refusing before it
|
|
260
|
+
opens a genotype file, on its own hardware, in the account it controls. The coordinator
|
|
261
|
+
runs the same check offline before dispatch, but that one only saves a queue wait.
|
|
262
|
+
|
|
263
|
+
**Bundles are content-addressed.** A sha-256 per file and a Merkle id over the set, so
|
|
264
|
+
"did this site run on the bundle I cut for it" is a string comparison. Without it, a site
|
|
265
|
+
running last month's bundle produces well-formed aggregates over the wrong individuals,
|
|
266
|
+
pools without complaint, and is wrong in no visible way.
|
|
267
|
+
|
|
268
|
+
**Results name the code that made them.** The tool pin covers the source of the two
|
|
269
|
+
modules APPFL ships to workers, is verified at launch, and is written into every run's
|
|
270
|
+
`ga4gh_provenance.json` alongside what each site attests to having actually done.
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
appfl-bio-suite ga4gh duo check --experiment fine-mapping # will every site permit this?
|
|
274
|
+
appfl-bio-suite ga4gh drs register --data-root local/data/… # address the bundles
|
|
275
|
+
appfl-bio-suite ga4gh trs publish --out local/trs # pin the tool
|
|
276
|
+
appfl-bio-suite ga4gh tes task --site X # what would run, as a document
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
All of it is opt-in per experiment: a `federation.yaml` with no `ga4gh` blocks produces
|
|
280
|
+
byte-identical configs to the ones it produced before any of this existed.
|
|
281
|
+
|
|
282
|
+
**→ [docs/coordinator/ga4gh.md](docs/coordinator/ga4gh.md)**
|
|
283
|
+
|
|
284
|
+
## The network map
|
|
285
|
+
|
|
286
|
+
Everyone in the federation — coordinator and partners alike — can open the same page:
|
|
287
|
+
every institution on a world map, which experiments each runs, what kind of data each
|
|
288
|
+
holds, how many samples they declared, and whether their endpoint is answering.
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
pip install 'appfl-bio-suite[watch]' -c constraints.txt
|
|
292
|
+
|
|
293
|
+
appfl-bio-suite watch build # draw it from federation.yaml
|
|
294
|
+
appfl-bio-suite watch serve # look at it locally
|
|
295
|
+
appfl-bio-suite watch export --out site/ # three static files anyone can host
|
|
296
|
+
appfl-bio-suite run gwas --watch # a live run, on the same map
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Built on [hivewatch](https://github.com/APPFL/hivewatch), APPFL's monitoring toolkit,
|
|
300
|
+
which supplies the event schema, the map format and the viewer.
|
|
301
|
+
|
|
302
|
+
**The map exists before any run does.** It is drawn from `federation.yaml` alone, so the
|
|
303
|
+
day the config names a partner, that partner is on the map — which is what makes it a
|
|
304
|
+
picture of the network rather than a dashboard for one job.
|
|
305
|
+
|
|
306
|
+
Site coordinates are declared in `federation.yaml`, never resolved from an IP address: a
|
|
307
|
+
partner's compute node has no outbound web access, and you already know where your
|
|
308
|
+
partners are. A site with no coordinates is reported as unplaced rather than drawn at a
|
|
309
|
+
guessed position. Service accounts, cluster paths, your Globus identity and (by default)
|
|
310
|
+
full endpoint UUIDs never reach the published page.
|
|
311
|
+
|
|
312
|
+
**→ [docs/coordinator/network-map.md](docs/coordinator/network-map.md)**
|
|
313
|
+
|
|
314
|
+
## Reproducibility
|
|
315
|
+
|
|
316
|
+
- **Every simulation run writes a manifest** recording the scenario, every seed, the suite
|
|
317
|
+
commit, input and output checksums, and package versions.
|
|
318
|
+
`simulate gwas --verify <manifest>` confirms a rerun mechanically.
|
|
319
|
+
- **The GWAS simulation is deterministic.** For a fixed seed, all 35 outputs are
|
|
320
|
+
byte-identical, verified against recorded checksums.
|
|
321
|
+
- **Known limits are documented.**
|
|
322
|
+
[docs/experiments/gwas/DATA.md](docs/experiments/gwas/DATA.md) states which input cohort
|
|
323
|
+
is not regenerable, and what the shipped substitute does and does not reproduce.
|
|
324
|
+
|
|
325
|
+
## Documentation
|
|
326
|
+
|
|
327
|
+
Organized by audience.
|
|
328
|
+
|
|
329
|
+
| | |
|
|
330
|
+
| --- | --- |
|
|
331
|
+
| [docs/README.md](docs/README.md) | Index: which document, for whom, in what order |
|
|
332
|
+
| [docs/coordinator/](docs/coordinator/) | Running a federation |
|
|
333
|
+
| [docs/partner/](docs/partner/) | What a partner receives — a closed set |
|
|
334
|
+
| [docs/experiments/](docs/experiments/) | Per-experiment design, data, and runbooks |
|
|
335
|
+
|
|
336
|
+
## Requirements
|
|
337
|
+
|
|
338
|
+
Python 3.12. A Globus account. Partners willing to run a privileged process on their own
|
|
339
|
+
clusters.
|
|
340
|
+
|
|
341
|
+
Not required: a shared filesystem, a VPN, matching operating systems or schedulers, or
|
|
342
|
+
inbound network access.
|
|
343
|
+
|
|
344
|
+
## Licence
|
|
345
|
+
|
|
346
|
+
MIT. See [LICENSE](LICENSE) — and note the third-party terms recorded there for APPFL,
|
|
347
|
+
FLamby, and PGS Catalog data.
|
|
348
|
+
|
|
349
|
+
For automated partner setup, see [bundle-based onboarding](docs/coordinator/onboarding.md).
|