gamfit 0.1.15__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 (251) hide show
  1. gamfit-0.1.15/.github/actions/bench-setup/action.yml +59 -0
  2. gamfit-0.1.15/.github/actions/setup-bench-r/action.yml +39 -0
  3. gamfit-0.1.15/.github/workflows/benchmark.yml +825 -0
  4. gamfit-0.1.15/.github/workflows/biobank_scale.yml +262 -0
  5. gamfit-0.1.15/.github/workflows/build-release-all.yml +159 -0
  6. gamfit-0.1.15/.github/workflows/fuzz.yml +95 -0
  7. gamfit-0.1.15/.github/workflows/jules-pr-validator.yml +216 -0
  8. gamfit-0.1.15/.github/workflows/jules_loop.yml +81 -0
  9. gamfit-0.1.15/.github/workflows/prover.yml +210 -0
  10. gamfit-0.1.15/.github/workflows/publish.yml +44 -0
  11. gamfit-0.1.15/.github/workflows/pypi-wheels.yml +138 -0
  12. gamfit-0.1.15/.github/workflows/test.yml +211 -0
  13. gamfit-0.1.15/.gitignore +104 -0
  14. gamfit-0.1.15/COMMERCIAL.md +24 -0
  15. gamfit-0.1.15/Cargo.lock +8964 -0
  16. gamfit-0.1.15/Cargo.toml +117 -0
  17. gamfit-0.1.15/LICENSE +661 -0
  18. gamfit-0.1.15/PKG-INFO +180 -0
  19. gamfit-0.1.15/README.md +288 -0
  20. gamfit-0.1.15/SPEC.md +11 -0
  21. gamfit-0.1.15/bench/_repro_seed.py +44 -0
  22. gamfit-0.1.15/bench/aniso_demo/01_raw.png +0 -0
  23. gamfit-0.1.15/bench/aniso_demo/02_normalized.png +0 -0
  24. gamfit-0.1.15/bench/aniso_demo/data.csv +301 -0
  25. gamfit-0.1.15/bench/aniso_demo/fit_aniso.log +45906 -0
  26. gamfit-0.1.15/bench/aniso_demo/fit_iso.log +49371 -0
  27. gamfit-0.1.15/bench/aniso_demo/model_aniso.json +1703 -0
  28. gamfit-0.1.15/bench/aniso_demo/model_iso.json +1697 -0
  29. gamfit-0.1.15/bench/aniso_demo/pred_aniso.csv +301 -0
  30. gamfit-0.1.15/bench/aniso_demo/pred_iso.csv +301 -0
  31. gamfit-0.1.15/bench/aniso_demo/run_demo.py +203 -0
  32. gamfit-0.1.15/bench/biobank_scale/biobank_scale.yml +88 -0
  33. gamfit-0.1.15/bench/biobank_scale/runner.py +4511 -0
  34. gamfit-0.1.15/bench/datasets/31_day.csv +746 -0
  35. gamfit-0.1.15/bench/datasets/bone.csv +24 -0
  36. gamfit-0.1.15/bench/datasets/cirrhosis.csv +419 -0
  37. gamfit-0.1.15/bench/datasets/five_day.csv +122 -0
  38. gamfit-0.1.15/bench/datasets/haberman.csv +306 -0
  39. gamfit-0.1.15/bench/datasets/heart_failure_clinical_records_dataset.csv +300 -0
  40. gamfit-0.1.15/bench/datasets/horse.csv +300 -0
  41. gamfit-0.1.15/bench/datasets/icu_survival_death.csv +20001 -0
  42. gamfit-0.1.15/bench/datasets/icu_survival_los.csv +20001 -0
  43. gamfit-0.1.15/bench/datasets/lidar.csv +222 -0
  44. gamfit-0.1.15/bench/datasets/prostate.csv +655 -0
  45. gamfit-0.1.15/bench/datasets/wine.csv +48 -0
  46. gamfit-0.1.15/bench/fuzz_vs_mgcv.py +1975 -0
  47. gamfit-0.1.15/bench/generate_figures.py +258 -0
  48. gamfit-0.1.15/bench/plot_subpop_centroid_order.py +225 -0
  49. gamfit-0.1.15/bench/prostate_gamair_results.json +95 -0
  50. gamfit-0.1.15/bench/run.py +109 -0
  51. gamfit-0.1.15/bench/run_suite.py +9157 -0
  52. gamfit-0.1.15/bench/run_survival_suite.py +72 -0
  53. gamfit-0.1.15/bench/scenarios.json +703 -0
  54. gamfit-0.1.15/bench/single_split_geo_disease_eas_duchon_k4_downsample300x.json +41 -0
  55. gamfit-0.1.15/bench/small_dense_results.json +95 -0
  56. gamfit-0.1.15/bench/spline_surface_comparison.py +365 -0
  57. gamfit-0.1.15/benches/branch_cell_biobank_hv.rs +97 -0
  58. gamfit-0.1.15/benches/bvn_biobank_shape.rs +43 -0
  59. gamfit-0.1.15/benches/cell_moment_lru_biobank_shape.rs +82 -0
  60. gamfit-0.1.15/benches/closed_form_criterion.rs +417 -0
  61. gamfit-0.1.15/benches/closed_form_pair_block.rs +157 -0
  62. gamfit-0.1.15/benches/closed_form_perf.rs +49 -0
  63. gamfit-0.1.15/benches/margslope_flex_biobank_hv.rs +70 -0
  64. gamfit-0.1.15/benches/non_affine_cell_hv_shape.rs +48 -0
  65. gamfit-0.1.15/benches/spatial_basis_construction.rs +65 -0
  66. gamfit-0.1.15/benches/trust_region_line_search.rs +46 -0
  67. gamfit-0.1.15/build.rs +102 -0
  68. gamfit-0.1.15/crates/gam-pyffi/Cargo.toml +19 -0
  69. gamfit-0.1.15/crates/gam-pyffi/src/lib.rs +1990 -0
  70. gamfit-0.1.15/docs/perf/joint_trust_region.md +24 -0
  71. gamfit-0.1.15/examples/validate_task24.rs +145 -0
  72. gamfit-0.1.15/install.sh +344 -0
  73. gamfit-0.1.15/lake-manifest.json +95 -0
  74. gamfit-0.1.15/lakefile.lean +5 -0
  75. gamfit-0.1.15/lean-toolchain +1 -0
  76. gamfit-0.1.15/memory/margslope_flex_biobank_harness.md +61 -0
  77. gamfit-0.1.15/memory/scaling_law_margslope_inner_pirls.md +34 -0
  78. gamfit-0.1.15/pyproject.toml +108 -0
  79. gamfit-0.1.15/python/README.md +110 -0
  80. gamfit-0.1.15/python/gamfit/__init__.py +58 -0
  81. gamfit-0.1.15/python/gamfit/_api.py +259 -0
  82. gamfit-0.1.15/python/gamfit/_binding.py +36 -0
  83. gamfit-0.1.15/python/gamfit/_diagnostics.py +88 -0
  84. gamfit-0.1.15/python/gamfit/_exceptions.py +30 -0
  85. gamfit-0.1.15/python/gamfit/_model.py +848 -0
  86. gamfit-0.1.15/python/gamfit/_schema.py +64 -0
  87. gamfit-0.1.15/python/gamfit/_summary.py +61 -0
  88. gamfit-0.1.15/python/gamfit/_tables.py +285 -0
  89. gamfit-0.1.15/python/gamfit/_validation.py +48 -0
  90. gamfit-0.1.15/python/gamfit/pgs.py +278 -0
  91. gamfit-0.1.15/python/gamfit/py.typed +1 -0
  92. gamfit-0.1.15/python/gamfit/sklearn.py +136 -0
  93. gamfit-0.1.15/rust-toolchain.toml +3 -0
  94. gamfit-0.1.15/rustfmt.toml +2 -0
  95. gamfit-0.1.15/scripts/codex_nightrun.sh +125 -0
  96. gamfit-0.1.15/scripts/duchon_1d_adaptive_jump_demo.py +588 -0
  97. gamfit-0.1.15/scripts/duchon_1d_power_compare.py +274 -0
  98. gamfit-0.1.15/scripts/duchon_2d.py +478 -0
  99. gamfit-0.1.15/scripts/fit_anisotropic_duchon.py +253 -0
  100. gamfit-0.1.15/scripts/jules_loop.py +355 -0
  101. gamfit-0.1.15/scripts/lean-check-all.sh +43 -0
  102. gamfit-0.1.15/scripts/plot_survival_digital_twins.py +1218 -0
  103. gamfit-0.1.15/scripts/summarize_latest_benchmark_run.py +362 -0
  104. gamfit-0.1.15/src/families/bernoulli_marginal_slope/deviation_runtime.rs +888 -0
  105. gamfit-0.1.15/src/families/bernoulli_marginal_slope/exact_kernel.rs +1 -0
  106. gamfit-0.1.15/src/families/bernoulli_marginal_slope.rs +18208 -0
  107. gamfit-0.1.15/src/families/cubic_cell_kernel.rs +6094 -0
  108. gamfit-0.1.15/src/families/custom_family.rs +18621 -0
  109. gamfit-0.1.15/src/families/family_meta.rs +40 -0
  110. gamfit-0.1.15/src/families/gamlss.rs +26810 -0
  111. gamfit-0.1.15/src/families/jet_partitions.rs +161 -0
  112. gamfit-0.1.15/src/families/latent_survival.rs +4207 -0
  113. gamfit-0.1.15/src/families/lognormal_kernel.rs +1490 -0
  114. gamfit-0.1.15/src/families/marginal_slope_intercept_solver.rs +146 -0
  115. gamfit-0.1.15/src/families/marginal_slope_shared.rs +1243 -0
  116. gamfit-0.1.15/src/families/mod.rs +22 -0
  117. gamfit-0.1.15/src/families/monotone_root.rs +376 -0
  118. gamfit-0.1.15/src/families/row_kernel.rs +574 -0
  119. gamfit-0.1.15/src/families/royston_parmar.rs +122 -0
  120. gamfit-0.1.15/src/families/scale_design.rs +1072 -0
  121. gamfit-0.1.15/src/families/sigma_link.rs +547 -0
  122. gamfit-0.1.15/src/families/strategy.rs +377 -0
  123. gamfit-0.1.15/src/families/survival.rs +3814 -0
  124. gamfit-0.1.15/src/families/survival_construction.rs +3664 -0
  125. gamfit-0.1.15/src/families/survival_location_scale.rs +14161 -0
  126. gamfit-0.1.15/src/families/survival_marginal_slope.rs +17996 -0
  127. gamfit-0.1.15/src/families/survival_predict.rs +1593 -0
  128. gamfit-0.1.15/src/families/transformation_normal.rs +15326 -0
  129. gamfit-0.1.15/src/inference/alo.rs +1670 -0
  130. gamfit-0.1.15/src/inference/data.rs +1517 -0
  131. gamfit-0.1.15/src/inference/diagnostics.rs +390 -0
  132. gamfit-0.1.15/src/inference/formula_dsl.rs +1460 -0
  133. gamfit-0.1.15/src/inference/generative.rs +153 -0
  134. gamfit-0.1.15/src/inference/hmc.rs +4841 -0
  135. gamfit-0.1.15/src/inference/mod.rs +13 -0
  136. gamfit-0.1.15/src/inference/model.rs +2855 -0
  137. gamfit-0.1.15/src/inference/polya_gamma.rs +203 -0
  138. gamfit-0.1.15/src/inference/predict.rs +6542 -0
  139. gamfit-0.1.15/src/inference/predict_input.rs +373 -0
  140. gamfit-0.1.15/src/inference/prediction_linalg.rs +421 -0
  141. gamfit-0.1.15/src/inference/probability.rs +343 -0
  142. gamfit-0.1.15/src/inference/quadrature.rs +5523 -0
  143. gamfit-0.1.15/src/lib.rs +66 -0
  144. gamfit-0.1.15/src/linalg/faer_ndarray.rs +1670 -0
  145. gamfit-0.1.15/src/linalg/matrix.lean +222 -0
  146. gamfit-0.1.15/src/linalg/matrix.rs +7556 -0
  147. gamfit-0.1.15/src/linalg/mod.rs +4 -0
  148. gamfit-0.1.15/src/linalg/sparse_exact.rs +1642 -0
  149. gamfit-0.1.15/src/linalg/utils.rs +908 -0
  150. gamfit-0.1.15/src/main.rs +15777 -0
  151. gamfit-0.1.15/src/report.rs +797 -0
  152. gamfit-0.1.15/src/resource.rs +279 -0
  153. gamfit-0.1.15/src/solver/active_set.rs +962 -0
  154. gamfit-0.1.15/src/solver/estimate.lean +187 -0
  155. gamfit-0.1.15/src/solver/estimate.rs +5903 -0
  156. gamfit-0.1.15/src/solver/mixture_link.rs +2364 -0
  157. gamfit-0.1.15/src/solver/mod.rs +9 -0
  158. gamfit-0.1.15/src/solver/outer_strategy.rs +8200 -0
  159. gamfit-0.1.15/src/solver/pirls.rs +11039 -0
  160. gamfit-0.1.15/src/solver/protocol.rs +84 -0
  161. gamfit-0.1.15/src/solver/reml/assembly.rs +488 -0
  162. gamfit-0.1.15/src/solver/reml/cache.rs +45 -0
  163. gamfit-0.1.15/src/solver/reml/eval.rs +373 -0
  164. gamfit-0.1.15/src/solver/reml/firth.rs +3467 -0
  165. gamfit-0.1.15/src/solver/reml/hyper.rs +2990 -0
  166. gamfit-0.1.15/src/solver/reml/inner_strategy.rs +136 -0
  167. gamfit-0.1.15/src/solver/reml/mod.rs +3837 -0
  168. gamfit-0.1.15/src/solver/reml/penalty_logdet.rs +1296 -0
  169. gamfit-0.1.15/src/solver/reml/runtime.rs +7956 -0
  170. gamfit-0.1.15/src/solver/reml/trace.rs +28 -0
  171. gamfit-0.1.15/src/solver/reml/unified.rs +14099 -0
  172. gamfit-0.1.15/src/solver/reml.lean +375 -0
  173. gamfit-0.1.15/src/solver/seeding.rs +787 -0
  174. gamfit-0.1.15/src/solver/visualizer.rs +1228 -0
  175. gamfit-0.1.15/src/solver/workflow.rs +2753 -0
  176. gamfit-0.1.15/src/span.rs +97 -0
  177. gamfit-0.1.15/src/terms/basis.lean +132 -0
  178. gamfit-0.1.15/src/terms/basis.rs +30316 -0
  179. gamfit-0.1.15/src/terms/closed_form_operator.rs +627 -0
  180. gamfit-0.1.15/src/terms/construction.lean +567 -0
  181. gamfit-0.1.15/src/terms/construction.rs +2868 -0
  182. gamfit-0.1.15/src/terms/hull.rs +406 -0
  183. gamfit-0.1.15/src/terms/layout.rs +253 -0
  184. gamfit-0.1.15/src/terms/mod.rs +8 -0
  185. gamfit-0.1.15/src/terms/penalty_op.rs +343 -0
  186. gamfit-0.1.15/src/terms/smooth.rs +20414 -0
  187. gamfit-0.1.15/src/terms/term_builder.rs +787 -0
  188. gamfit-0.1.15/src/testing/mod.rs +168 -0
  189. gamfit-0.1.15/src/types.rs +745 -0
  190. gamfit-0.1.15/tests/alo_tests.rs +535 -0
  191. gamfit-0.1.15/tests/aniso_integration.rs +166 -0
  192. gamfit-0.1.15/tests/aniso_population_calibration.rs +318 -0
  193. gamfit-0.1.15/tests/autodiff_binomial_location_scale_exact.rs +816 -0
  194. gamfit-0.1.15/tests/autodiff_crosscheck.rs +270 -0
  195. gamfit-0.1.15/tests/autodiff_crosscheck_extended.rs +483 -0
  196. gamfit-0.1.15/tests/autodiff_custom_family_joint_laml.rs +720 -0
  197. gamfit-0.1.15/tests/autodiff_custom_family_pseudo_laplace.rs +284 -0
  198. gamfit-0.1.15/tests/autodiff_gaussian_location_scale_exact.rs +499 -0
  199. gamfit-0.1.15/tests/autodiff_sas_hypergradient_localization.rs +396 -0
  200. gamfit-0.1.15/tests/bench_biobank_scale_runner_test.py +2052 -0
  201. gamfit-0.1.15/tests/bench_fuzz_vs_mgcv_test.py +318 -0
  202. gamfit-0.1.15/tests/bench_run_suite_mapping_test.py +965 -0
  203. gamfit-0.1.15/tests/bench_run_suite_optional_imports_test.py +37 -0
  204. gamfit-0.1.15/tests/bench_tools/bench.py +568 -0
  205. gamfit-0.1.15/tests/bench_tools/compare.py +1071 -0
  206. gamfit-0.1.15/tests/bench_tools/gam_model_fit.joblib +0 -0
  207. gamfit-0.1.15/tests/bench_tools/generate_survival_reference.py +286 -0
  208. gamfit-0.1.15/tests/bench_tools/mgcv.py +190 -0
  209. gamfit-0.1.15/tests/bench_tools/plot.py +700 -0
  210. gamfit-0.1.15/tests/bench_tools/rds_view.py +141 -0
  211. gamfit-0.1.15/tests/bench_tools/run_calibrate.py +121 -0
  212. gamfit-0.1.15/tests/bench_tools/run_mgcv.R +41 -0
  213. gamfit-0.1.15/tests/bench_tools/synthetic_classification_data.csv +2501 -0
  214. gamfit-0.1.15/tests/bench_tools/view_basis.py +307 -0
  215. gamfit-0.1.15/tests/biobank_convergence_regression.rs +291 -0
  216. gamfit-0.1.15/tests/biobank_dense_regression_guard.rs +239 -0
  217. gamfit-0.1.15/tests/biobank_margslope_repro.rs +299 -0
  218. gamfit-0.1.15/tests/biobank_reml_stress.rs +410 -0
  219. gamfit-0.1.15/tests/common/mod.rs +257 -0
  220. gamfit-0.1.15/tests/conftest.py +87 -0
  221. gamfit-0.1.15/tests/dual_risk_test.rs +60 -0
  222. gamfit-0.1.15/tests/duchon_integration.rs +486 -0
  223. gamfit-0.1.15/tests/exact_oracle_tests.rs +202 -0
  224. gamfit-0.1.15/tests/external_gradient_trend.rs +219 -0
  225. gamfit-0.1.15/tests/firth_behavior.rs +264 -0
  226. gamfit-0.1.15/tests/gradient_decompose_test.rs +950 -0
  227. gamfit-0.1.15/tests/gradient_isolation.rs +307 -0
  228. gamfit-0.1.15/tests/ground_truth_gradient.rs +376 -0
  229. gamfit-0.1.15/tests/integration_marginal_slope.py +238 -0
  230. gamfit-0.1.15/tests/integration_pit_pipeline.py +305 -0
  231. gamfit-0.1.15/tests/margslope_flex_biobank_repro.rs +109 -0
  232. gamfit-0.1.15/tests/margslope_inner_pirls_scaling.rs +472 -0
  233. gamfit-0.1.15/tests/matern_integration.rs +421 -0
  234. gamfit-0.1.15/tests/no_production_finite_differences.rs +207 -0
  235. gamfit-0.1.15/tests/power_law_analyzer.rs +234 -0
  236. gamfit-0.1.15/tests/probit_integration.rs +361 -0
  237. gamfit-0.1.15/tests/repro_gamlss_linesearch_failure.rs +77 -0
  238. gamfit-0.1.15/tests/sas_mixture_system.rs +374 -0
  239. gamfit-0.1.15/tests/standard_gam_scaling.rs +266 -0
  240. gamfit-0.1.15/tests/stateful_saved_model_sync.rs +390 -0
  241. gamfit-0.1.15/tests/subsample_outer_integration.rs +230 -0
  242. gamfit-0.1.15/tests/survival_optimizer_api.rs +53 -0
  243. gamfit-0.1.15/tests/survival_regression.rs +137 -0
  244. gamfit-0.1.15/tests/test_e2e_pgs_pipeline.py +272 -0
  245. gamfit-0.1.15/tests/test_python_api.py +661 -0
  246. gamfit-0.1.15/tests/test_support/margslope_flex_equivalence.rs +322 -0
  247. gamfit-0.1.15/tests/test_tables.py +48 -0
  248. gamfit-0.1.15/tests/thin_plate_integration.rs +376 -0
  249. gamfit-0.1.15/tests/tps_smallk_basis_regression.rs +491 -0
  250. gamfit-0.1.15/tests/uncertainty_integration.rs +512 -0
  251. gamfit-0.1.15/tests/warm_start_quality_regression.rs +420 -0
@@ -0,0 +1,59 @@
1
+ name: bench-setup
2
+ description: Shared setup for benchmark jobs
3
+ inputs:
4
+ install-runtime-deps:
5
+ description: "Install benchmark Python/R dependencies in the job environment"
6
+ required: false
7
+ default: "true"
8
+ r-version:
9
+ description: "R version to install for benchmark jobs"
10
+ required: false
11
+ default: "4.4.3"
12
+ runs:
13
+ using: composite
14
+ steps:
15
+ - name: Checkout
16
+ uses: actions/checkout@v5
17
+
18
+ - name: Install Rust stable
19
+ uses: dtolnay/rust-toolchain@stable
20
+
21
+ - name: Set up Python
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: "3.11"
25
+
26
+ - name: Set up R
27
+ uses: ./.github/actions/setup-bench-r
28
+ with:
29
+ r-version: ${{ inputs.r-version }}
30
+
31
+ - name: Cache Python packages
32
+ uses: actions/cache@v4
33
+ with:
34
+ path: ~/.cache/pip
35
+ key: ${{ runner.os }}-bench-pip-${{ hashFiles('.github/actions/bench-setup/action.yml') }}
36
+ restore-keys: |
37
+ ${{ runner.os }}-bench-pip-
38
+
39
+ - name: Cache R user library
40
+ uses: actions/cache@v4
41
+ with:
42
+ path: ${{ github.workspace }}/.r-lib
43
+ key: ${{ runner.os }}-bench-rlib-${{ hashFiles('.github/actions/bench-setup/action.yml') }}
44
+ restore-keys: |
45
+ ${{ runner.os }}-bench-rlib-
46
+
47
+ - name: Cache cargo artifacts
48
+ uses: Swatinem/rust-cache@v2
49
+
50
+ - name: Install benchmark runtime deps
51
+ if: ${{ inputs.install-runtime-deps == 'true' }}
52
+ shell: bash
53
+ run: |
54
+ mkdir -p "${R_LIBS_USER}"
55
+ python3 --version
56
+ Rscript --version
57
+ python3 -m pip install --upgrade pip setuptools wheel
58
+ python3 -m pip install numpy pandas scikit-learn lifelines scikit-survival xgboost
59
+ Rscript -e 'install.packages(c("mgcv","jsonlite","survival","glmnet","gamlss","gamlss.dist","gamboostLSS","mboost","bamlss","brms"), repos="https://cloud.r-project.org", lib=Sys.getenv("R_LIBS_USER"), Ncpus=max(1L, parallel::detectCores()-1L))'
@@ -0,0 +1,39 @@
1
+ name: setup-bench-r
2
+ description: Set up R for benchmark jobs with an explicit fallback path
3
+ inputs:
4
+ r-version:
5
+ description: "R version to install for benchmark jobs"
6
+ required: false
7
+ default: "4.4.3"
8
+ runs:
9
+ using: composite
10
+ steps:
11
+ - name: Set up R with setup-r
12
+ id: setup-r
13
+ continue-on-error: true
14
+ uses: r-lib/actions/setup-r@v2
15
+ with:
16
+ r-version: ${{ inputs.r-version }}
17
+
18
+ - name: Install R from CRAN apt repo
19
+ if: ${{ steps.setup-r.outcome != 'success' }}
20
+ shell: bash
21
+ run: |
22
+ set -euo pipefail
23
+ . /etc/os-release
24
+ sudo apt-get update
25
+ sudo apt-get install --yes --no-install-recommends ca-certificates dirmngr gpg wget
26
+ wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc \
27
+ | gpg --dearmor \
28
+ | sudo tee /usr/share/keyrings/cran.gpg >/dev/null
29
+ echo "deb [signed-by=/usr/share/keyrings/cran.gpg] https://cloud.r-project.org/bin/linux/ubuntu ${VERSION_CODENAME}-cran40/" \
30
+ | sudo tee /etc/apt/sources.list.d/cran-r.list >/dev/null
31
+ sudo apt-get update
32
+ sudo apt-get install --yes --no-install-recommends r-base r-base-dev
33
+
34
+ - name: Verify R is available
35
+ shell: bash
36
+ run: |
37
+ set -euo pipefail
38
+ command -v Rscript
39
+ Rscript --version