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.
Files changed (202) hide show
  1. appfl_bio_suite-0.3.0/CITATION.cff +59 -0
  2. appfl_bio_suite-0.3.0/LICENSE +33 -0
  3. appfl_bio_suite-0.3.0/MANIFEST.in +5 -0
  4. appfl_bio_suite-0.3.0/PKG-INFO +349 -0
  5. appfl_bio_suite-0.3.0/README.md +244 -0
  6. appfl_bio_suite-0.3.0/constraints.txt +163 -0
  7. appfl_bio_suite-0.3.0/docs/partner/endpoint-setup.md +297 -0
  8. appfl_bio_suite-0.3.0/docs/partner/experiments/fine-mapping.md +234 -0
  9. appfl_bio_suite-0.3.0/docs/partner/experiments/flamby-heart-disease.md +166 -0
  10. appfl_bio_suite-0.3.0/docs/partner/experiments/gwas.md +124 -0
  11. appfl_bio_suite-0.3.0/docs/partner/experiments/methylation.md +10 -0
  12. appfl_bio_suite-0.3.0/docs/partner/onboarding.md +172 -0
  13. appfl_bio_suite-0.3.0/partners/templates/user_config_template.yaml.j2 +71 -0
  14. appfl_bio_suite-0.3.0/partners/templates/validate_mapping.py +120 -0
  15. appfl_bio_suite-0.3.0/pyproject.toml +241 -0
  16. appfl_bio_suite-0.3.0/requirements-multisusie.txt +2 -0
  17. appfl_bio_suite-0.3.0/setup.cfg +4 -0
  18. appfl_bio_suite-0.3.0/setup.py +20 -0
  19. appfl_bio_suite-0.3.0/src/appfl_bio_suite/__init__.py +78 -0
  20. appfl_bio_suite-0.3.0/src/appfl_bio_suite/cli.py +1435 -0
  21. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/__init__.py +0 -0
  22. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/compat.py +217 -0
  23. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/config.py +972 -0
  24. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/__init__.py +14 -0
  25. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/globus_compute_driver.py +228 -0
  26. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/serial_driver.py +168 -0
  27. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/drivers/tes_driver.py +306 -0
  28. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/endpoint.py +280 -0
  29. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/experiments.py +319 -0
  30. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/__init__.py +70 -0
  31. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/data/duo.json +399 -0
  32. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/drs.py +805 -0
  33. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/duo.py +762 -0
  34. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/resolve.py +282 -0
  35. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/tes.py +456 -0
  36. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/ga4gh/trs.py +772 -0
  37. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/identity.py +273 -0
  38. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/join.py +214 -0
  39. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/launch.py +638 -0
  40. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/loopback.py +336 -0
  41. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/onboarding.py +669 -0
  42. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/onboarding_cli.py +174 -0
  43. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/partner.py +410 -0
  44. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/plot_assets/argonne-palette.css +206 -0
  45. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/plot_style.py +92 -0
  46. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/preflight.py +961 -0
  47. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/simulation.py +412 -0
  48. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/site_credentials.py +171 -0
  49. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/site_trial.py +198 -0
  50. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch.py +849 -0
  51. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/THIRD_PARTY.md +39 -0
  52. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/globe.js +489 -0
  53. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/land.js +2 -0
  54. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/results.js +162 -0
  55. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/suite-logo.png +0 -0
  56. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/vendor.js +2 -0
  57. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/viewer.css +372 -0
  58. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_assets/viewer.js +601 -0
  59. appfl_bio_suite-0.3.0/src/appfl_bio_suite/core/watch_catalog.py +209 -0
  60. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/__init__.py +0 -0
  61. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/__init__.py +59 -0
  62. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/aggregator.py +860 -0
  63. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/arms.py +787 -0
  64. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/backend_outputs.py +124 -0
  65. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/composition.py +675 -0
  66. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/clients.template.yaml +37 -0
  67. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/server.loopback.yaml +77 -0
  68. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/server.yaml +108 -0
  69. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/simulation/ci-tiny.yaml +188 -0
  70. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/configs/simulation/three-site-hapnest.yaml +195 -0
  71. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/dataset.py +777 -0
  72. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/UPSTREAM.json +40 -0
  73. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/__init__.py +18 -0
  74. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/fed_fine_mapping.py +1096 -0
  75. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/fine_mapping.py +739 -0
  76. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/locus_selection.py +696 -0
  77. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/phenotype_sim.py +870 -0
  78. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/qc.py +357 -0
  79. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/sampling.py +300 -0
  80. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/utils.py +601 -0
  81. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/fedfm/validation.py +731 -0
  82. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/__init__.py +16 -0
  83. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/detail.py +453 -0
  84. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/eda.py +974 -0
  85. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/federation.py +1055 -0
  86. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/figstyle.py +526 -0
  87. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/paper_plots.py +1954 -0
  88. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/figures/render.py +201 -0
  89. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/inference.py +258 -0
  90. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/matched_comparison.py +526 -0
  91. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie.py +245 -0
  92. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_batch.py +259 -0
  93. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_compare.py +328 -0
  94. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_experiment.py +137 -0
  95. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/multisusie_pipeline.py +508 -0
  96. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/plotting.py +104 -0
  97. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/reporting.py +271 -0
  98. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/rerun.py +408 -0
  99. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/secure_aggregation.py +74 -0
  100. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/__init__.py +399 -0
  101. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/bundler.py +227 -0
  102. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/cohort.py +299 -0
  103. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/schema.py +393 -0
  104. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/simulation/stages.py +232 -0
  105. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/site_stage.py +260 -0
  106. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/fine_mapping/trainer.py +798 -0
  107. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/__init__.py +8 -0
  108. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/clients.template.yaml +32 -0
  109. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/server.fedcompass.yaml +92 -0
  110. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/server.loopback.yaml +57 -0
  111. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/configs/server.yaml +80 -0
  112. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/dataset.py +100 -0
  113. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/flamby_heart_disease/model.py +61 -0
  114. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/__init__.py +17 -0
  115. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/aggregator.py +312 -0
  116. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/clients.template.yaml +30 -0
  117. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/server.loopback.yaml +42 -0
  118. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/server.yaml +48 -0
  119. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/ci-tiny.yaml +28 -0
  120. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/published-five-site.yaml +53 -0
  121. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/three-site-skewed.yaml +24 -0
  122. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/configs/simulation/two-site-balanced.yaml +24 -0
  123. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/dataset.py +109 -0
  124. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/plotting.py +143 -0
  125. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/__init__.py +310 -0
  126. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/bundler.py +252 -0
  127. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/cohort.py +303 -0
  128. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/phenotypes.py +429 -0
  129. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/simulation/schema.py +205 -0
  130. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/gwas/trainer.py +575 -0
  131. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/__init__.py +4 -0
  132. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/__main__.py +68 -0
  133. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/ci-tiny.yaml +13 -0
  134. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/poc.yaml +13 -0
  135. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/stress.yaml +19 -0
  136. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/tcga-laml.yaml +13 -0
  137. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/uneven-curves.yaml +39 -0
  138. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/configs/uneven.yaml +36 -0
  139. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/dataset.py +155 -0
  140. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/evaluation.py +55 -0
  141. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/figures.py +806 -0
  142. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/gdc.py +234 -0
  143. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/model.py +32 -0
  144. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/pipeline.py +479 -0
  145. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/preprocessing.py +152 -0
  146. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/reporting.py +122 -0
  147. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/runner.py +25 -0
  148. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/simulation.py +85 -0
  149. appfl_bio_suite-0.3.0/src/appfl_bio_suite/experiments/methylation/stress.py +95 -0
  150. appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/PKG-INFO +349 -0
  151. appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/SOURCES.txt +200 -0
  152. appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/dependency_links.txt +1 -0
  153. appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/entry_points.txt +2 -0
  154. appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/requires.txt +63 -0
  155. appfl_bio_suite-0.3.0/src/appfl_bio_suite.egg-info/top_level.txt +1 -0
  156. appfl_bio_suite-0.3.0/tests/test_configs.py +262 -0
  157. appfl_bio_suite-0.3.0/tests/test_docs.py +380 -0
  158. appfl_bio_suite-0.3.0/tests/test_endpoint_smoke.py +92 -0
  159. appfl_bio_suite-0.3.0/tests/test_fine_mapping_appfl_parity.py +240 -0
  160. appfl_bio_suite-0.3.0/tests/test_fine_mapping_centralized.py +214 -0
  161. appfl_bio_suite-0.3.0/tests/test_fine_mapping_composition.py +644 -0
  162. appfl_bio_suite-0.3.0/tests/test_fine_mapping_configs.py +305 -0
  163. appfl_bio_suite-0.3.0/tests/test_fine_mapping_federated.py +890 -0
  164. appfl_bio_suite-0.3.0/tests/test_fine_mapping_harmonization.py +99 -0
  165. appfl_bio_suite-0.3.0/tests/test_fine_mapping_locus_selection.py +165 -0
  166. appfl_bio_suite-0.3.0/tests/test_fine_mapping_multisusie.py +447 -0
  167. appfl_bio_suite-0.3.0/tests/test_fine_mapping_multisusie_appfl.py +274 -0
  168. appfl_bio_suite-0.3.0/tests/test_fine_mapping_multisusie_recovery.py +243 -0
  169. appfl_bio_suite-0.3.0/tests/test_fine_mapping_phenotypes.py +280 -0
  170. appfl_bio_suite-0.3.0/tests/test_fine_mapping_sampling.py +92 -0
  171. appfl_bio_suite-0.3.0/tests/test_fine_mapping_scientific.py +535 -0
  172. appfl_bio_suite-0.3.0/tests/test_fine_mapping_secure_aggregation.py +187 -0
  173. appfl_bio_suite-0.3.0/tests/test_fine_mapping_secure_backends.py +90 -0
  174. appfl_bio_suite-0.3.0/tests/test_fine_mapping_shipped_parity.py +468 -0
  175. appfl_bio_suite-0.3.0/tests/test_fine_mapping_utils.py +222 -0
  176. appfl_bio_suite-0.3.0/tests/test_flamby_parity.py +228 -0
  177. appfl_bio_suite-0.3.0/tests/test_ga4gh_drs.py +336 -0
  178. appfl_bio_suite-0.3.0/tests/test_ga4gh_duo.py +311 -0
  179. appfl_bio_suite-0.3.0/tests/test_ga4gh_enforcement.py +392 -0
  180. appfl_bio_suite-0.3.0/tests/test_ga4gh_shipped_parity.py +175 -0
  181. appfl_bio_suite-0.3.0/tests/test_ga4gh_trs_tes.py +485 -0
  182. appfl_bio_suite-0.3.0/tests/test_globus_service_account_probe.py +110 -0
  183. appfl_bio_suite-0.3.0/tests/test_gwas_loader_contract.py +106 -0
  184. appfl_bio_suite-0.3.0/tests/test_gwas_meta_analysis.py +102 -0
  185. appfl_bio_suite-0.3.0/tests/test_gwas_simulation_parity.py +248 -0
  186. appfl_bio_suite-0.3.0/tests/test_launch_and_loopback.py +161 -0
  187. appfl_bio_suite-0.3.0/tests/test_matched_comparison.py +76 -0
  188. appfl_bio_suite-0.3.0/tests/test_methylation.py +558 -0
  189. appfl_bio_suite-0.3.0/tests/test_methylation_gdc.py +143 -0
  190. appfl_bio_suite-0.3.0/tests/test_multisusie_parallel.py +38 -0
  191. appfl_bio_suite-0.3.0/tests/test_onboarding.py +657 -0
  192. appfl_bio_suite-0.3.0/tests/test_package_data.py +94 -0
  193. appfl_bio_suite-0.3.0/tests/test_preflight.py +129 -0
  194. appfl_bio_suite-0.3.0/tests/test_second_federation.py +181 -0
  195. appfl_bio_suite-0.3.0/tests/test_shipped_modules.py +283 -0
  196. appfl_bio_suite-0.3.0/tests/test_simulation_provenance.py +252 -0
  197. appfl_bio_suite-0.3.0/tests/test_site_credentials.py +287 -0
  198. appfl_bio_suite-0.3.0/tests/test_upstream_shim.py +110 -0
  199. appfl_bio_suite-0.3.0/tests/test_vendored_path.py +63 -0
  200. appfl_bio_suite-0.3.0/tests/test_version_is_consistent.py +44 -0
  201. appfl_bio_suite-0.3.0/tests/test_watch.py +648 -0
  202. 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,5 @@
1
+ recursive-include docs/partner *.md
2
+ recursive-include partners/templates *.j2 *.py
3
+ include constraints.txt
4
+ include requirements-multisusie.txt
5
+ include CITATION.cff
@@ -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).