Tasks/Life Sciences/Single-Cell Omics

Predict gene expression from scATAC-seq peaks (PBMC)

Predict expression from chromatin accessibility alone

pbmc_gene_expression_prediction Life Sciences Single-Cell Omics
instruction.mdthis is what the agent is given

Single-cell ATAC-seq measures chromatin accessibility as a sparse, high-dimensional set of binary peaks per cell. You inherit the classical Gene Activity baseline — it merely sums accessibility near each gene's transcription start site, capturing only local proximity — and your job is to predict, for each cell, the discretized expression (bins 0–9) of each target gene from that cell's binary peak set. Improve the method in place; it is re-run by a sealed verifier on a hidden test split and scored by the mean per-gene rank correlation, so only a method that generalizes the global peak-to-gene program counts.

Hard Constraints

  • Submit an algorithm (solve), not precomputed numbers — the verifier re-runs your code on hidden cells.
  • Keep the exact signature solve(atac_train, expr_train, atac_test, peak_names, gene_names) -> np.ndarray (n_test_cells, n_genes).
  • Input peaks are binary (accessible / not) — do not assume read counts. Predict for the fixed target gene list (gene_names); predictions may be continuous floats (the metric is rank-based).
  • Output must be finite and shaped (n_test_cells, n_genes), or the submission scores 0.
  • Train only on the provided fine-tuning split; the test cells are sealed in the verifier and there is no network at grade time. Do not hardcode or look up answers.

What You Have

  • The workspace /app/:
  • Visible data (/app/data/): the fine-tuning split — paired ATAC peaks (pbmc_atlas_atac.h5ad, binary; var_names="chr-start-end") + binned RNA (pbmc_atlas_rna_binning_10.h5ad, bins 0–9, cells paired with ATAC) + the target gene list (pbmc_atlas_variable_genes.csv). Ground truth is included here for local debugging only.
  • The editable baseline /app/methods/main/this directory is what gets graded: the weak Gene Activity baseline, which sums peak accessibility near each gene's TSS. It is the only method provided. Improve main in place or rewrite it entirely.
  • Your self-check surface (free): python /app/selfcheck.py cuts the visible split into an internal train/val and reports SRCC / PRCC / MSE on the val cells. This is a proxy — the sealed test cells differ, so a good self-check is necessary, not sufficient.

What You Submit

Edit /app/methods/main/solver.py to expose:

def solve(atac_train, expr_train, atac_test, peak_names, gene_names):
    # atac_train : scipy.sparse CSR (n_train_cells, n_peaks), binary {0,1}
    # expr_train : np.ndarray int   (n_train_cells, n_genes), binned 0..9
    # atac_test  : scipy.sparse CSR (n_test_cells,  n_peaks), binary {0,1}
    # peak_names : list[str] length n_peaks, "chr-start-end"
    # gene_names : list[str] length n_genes
    # returns    : np.ndarray float (n_test_cells, n_genes) predicted expression

You may add helper modules next to solver.py. The runtime provides numpy / scipy / scikit-learn / torch (and anndata for the self-check). There is no submit step and no per-attempt feedback — self-check for as long as your run window allows, then leave your best solver.py in place; it is graded once at the end on the hidden cells.

How It Is Judged

After your run, the verifier fits your solve on the hidden fine-tuning split and predicts on the hidden test split (your code runs in an isolated subprocess that receives only feature arrays, so it cannot read the answer). For each target gene it computes the Spearman correlation between predicted and true expression across test cells:

metric = mean over genes of  Spearman(pred[:, g], true[:, g])     (genes with zero true variance excluded)

The metric is mean per-gene SRCC (higher is better). Per-gene rank correlation is invariant to per-cell constant shifts, so emitting a constant or copying the input cannot score.

Metric

mean per-gene Spearman correlation on the sealed test cells · higher is better

Spearman(pred, true) per target gene across 3,767 hidden cells, averaged over the 2,000 HVGs

anchorvisible setheld-outreward
BGene Activity baseline0.05900.06100.00
SEpiFoundation SOTA0.42210.50
Uperfect correlation1.00001.00
normalisation
m <= B0
B < m <= S0.5 * (m - B) / (S - B)
S < m <= U0.5 + 0.5 * (m - S) / (U - S)
m > U1

m = this run's held-out metric  ·  B = Gene Activity baseline  ·  S = EpiFoundation SOTA  ·  U = perfect correlation

Linear in SRCC, no transform. One hidden split, one reward; any error or wrong shape scores 0.

Rollouts

453 minwall clock
$69.31spend
121.5Mtokens
115versions, 40 kept
0.08 0.12 0.16 0.20 $0 $15 $30 $45 $60 cumulative spend on the run self-check SRCC, seed 2002 split, higher is better v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 v47 v48 v49 v50 v51 v52 v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 v63 v64 v65 v66 v67 v68 v69 v70 v71 v72 v73 v74 v75 v76 v77 v78 v79 v80 v81 v82 v83 v84 v85 v86 v87 v88 v89 v90 v91 v92 v93 v94 v95 v96 v97 v98 v99 v100 v101 v102 v103 v104 v105 v106 v107 v108 v109 v110 v111 v112 v113 v114
keptrevertedno scoreturning point
  1. v0Inherited Gene Activity: sum peaks over a 2 kb promoter plus the gene body0.0598 min · $0.59
  2. v1Ridge marginal effects on the 64 strongest peaks per gene, body +/-100 kb0.0788814 min · $1.19
  3. v2Cis search widened to 500 kb, 128 peaks kept per gene0.0943716 min · $1.43
  4. v3Cis search widened to 2 Mb at the same 128 selected peaks0.1143518 min · $1.61
  5. v4Cis search widened to 10 Mb0.1350121 min · $1.82
  6. v524 genome-wide RNA latent factors, each from 4,096 screened peaksPredict the cell's whole expression program from peaks anywhere in the genome, not each gene from its own neighbourhood.0.197329 min · $2.41
  7. v6Supervised factor rank raised from 24 to 480.1981732 min · $2.62
  8. v7Factor rank raised to 960.197236 min · $2.83
  9. v8Peaks per factor cut from 4,096 to 1,0240.1950639 min · $3.05
  10. v9Peaks per factor raised to 8,1920.1992342 min · $3.27
  11. v10Peaks per factor raised to 16,3840.199946 min · $3.48
  12. v11Peaks per factor raised to 32,7680.2003450 min · $3.70
  13. v12RNA variance-standardization floor raised from 0.25 to 1.00.2008153 min · $3.92
  14. v13Variance floor raised further to 4.00.2009557 min · $4.15
  15. v14Gene variance standardization removed, raw centered bins0.200561 min · $4.38
  16. v1564-neighbor inverse-distance RNA label transfer from the calibration cells0.1896570 min · $4.96
  17. v1670/30 blend of linear factor reconstruction and neighbor label transfer0.2041771 min · $5.20
  18. v17Calibration/reference partition enlarged from 15% to 30%0.2048375 min · $5.71
  19. v18Even 50/50 peak-screening and reference split0.2049476 min · $5.96
  20. v19Label-transfer neighbors raised from 64 to 1280.2051978 min · $6.22
  21. v20Neighbors raised to 2560.2050179 min · $6.48
  22. v21Uniform instead of inverse-distance neighbor weights0.2050780 min · $6.74
  23. v22Neighbor weights sharpened to inverse squared distance0.2052982 min · $7.00
  24. v23Neighbor weights sharpened to inverse cubed distance0.2053684 min · $7.31
  25. v24Direct TF-IDF cosine label transfer against 20,000 training cellsaborted at 240 s89 min · $7.72
  26. v25TF-IDF reference reduced to 2,000 cells0.162292 min · $8.22
  27. v26Bins replaced by per-gene empirical mid-CDF ranks before factorization0.206100 min · $9.11
  28. v27Rank-space variance floor lowered from 0.05 to 0.010.20592102 min · $9.40
  29. v28Rank-space variance floor raised to 0.200.20584103 min · $9.70
  30. v29Rank-space factor count raised from 48 to 640.20614107 min · $10.24
  31. v30Rank-space factor count raised to 800.20616108 min · $10.54
  32. v31ATAC depth-normalized by sqrt(median fragments / cell fragments)Divide out library size so a peak value reports regulatory state rather than how deeply the cell was sequenced.0.20957110 min · $10.86
  33. v32Normalization strengthened from inverse sqrt depth to inverse depth0.2101112 min · $11.17
  34. v33Over-normalized by inverse depth^1.50.2076114 min · $11.49
  35. v34Row normalization fused into the sparse products; identical, 20% faster0.2101115 min · $11.83
  36. v35Peak-effect ridge shrinkage lowered from 80 to 200.20961119 min · $12.40
  37. v36Peak-effect ridge shrinkage raised from 80 to 2000.21026120 min · $12.73
  38. v37Ridge shrinkage raised to 5000.21023122 min · $13.05
  39. v38Peaks per factor doubled from 32,768 to 65,5360.21069124 min · $13.38
  40. v39Peaks per factor doubled again to 131,0720.21072125 min · $13.71
  41. v40Blend retuned to 80% linear factors / 20% neighbors0.2101127 min · $14.07
  42. v41Blend retuned to 60% linear factors / 40% neighbors0.21088129 min · $14.40
  43. v42Even 50/50 linear/neighbor blend0.21072130 min · $14.74
  44. v43Cubic log-depth basis for the shared library-complexity term0.21105132 min · $15.12
  45. v44Gene-specific correction from the 64 best residual cis peaks within 2 Mb0.21107135 min · $15.52
  46. v4532 RNA-state clusters classified by a smoothed multinomial peak model0.19713140 min · $16.23
  47. v46Target switched to binary RNA detection instead of expression ranks0.21071143 min · $16.90
  48. v47One model on a joint 80% mid-CDF-rank + 20% detection target0.21104145 min · $17.29
  49. v48Screening/calibration partition seed changed from 991 to 19910.21112148 min · $17.93
  50. v49Two honest partitions averaged inside a single solve0.21246151 min · $18.47
  51. v50Third independent partition, seed 29910.2114153 min · $19.03
  52. v51Fourth independent partition, seed 39910.21123156 min · $19.59
  53. v52Four-partition linear variance-reduction ensemble0.2134166 min · $20.35
  54. v53Linear factor calibration replaced by a 48-96-48 ReLU MLPDecode peak scores into RNA factors with a small network, so the peak-to-expression map need not be linear.0.21241168 min · $20.96
  55. v54MLP calibration allowed 200 rather than 100 iterations0.21252171 min · $21.37
  56. v55Calibration MLP deepened to 48-128-64-480.21297173 min · $21.80
  57. v56Calibration MLP widened to 48-256-128-480.21339176 min · $22.22
  58. v57Calibration MLP widened further to 48-512-256-480.21292179 min · $22.64
  59. v58MLP L2 penalty raised from 5 to 200.20801182 min · $23.07
  60. v59MLP L2 penalty lowered from 5 to 10.21532185 min · $23.50
  61. v60MLP L2 penalty lowered further to 0.20.21501188 min · $23.94
  62. v61Intermediate MLP L2 penalty of 2.00.21499190 min · $24.37
  63. v62Same nonlinear model on partition seed 19910.21561199 min · $25.34
  64. v63Nonlinear model on partition seed 29910.21549202 min · $25.96
  65. v64Nonlinear model on partition seed 39910.21537207 min · $27.06
  66. v65Four-way nonlinear ensemble over one shared RNA factorization0.21778213 min · $28.02
  67. v66Calibration/reference subset enlarged from 30% to 50%0.21614216 min · $28.48
  68. v67Peak screening cut to 30%, calibration reference raised to 70%0.21603219 min · $28.95
  69. v68Second 50/50 partition, seed 1991, as a mixed-ensemble candidate0.2163225 min · $30.19
  70. v69Nonlinear model factor rank raised from 48 to 640.21554228 min · $30.67
  71. v70Nonlinear factor rank raised to 800.21548232 min · $31.34
  72. v7164-factor nonlinear model on partition seed 19910.21576236 min · $32.03
  73. v7264-factor nonlinear model on partition seed 29910.21595241 min · $32.71
  74. v7364-factor nonlinear model on partition seed 39910.2156245 min · $33.60
  75. v74Shared-factor four-way 64-factor nonlinear ensemble0.2183254 min · $34.80
  76. v75MLP batch size doubled from 256 to 5120.21523257 min · $35.31
  77. v76MLP epoch cap cut to 100; predictions bit-identical to v690.21554259 min · $35.83
  78. v77Peaks per nonlinear factor cut from 65,536 to 32,7680.21514262 min · $36.34
  79. v78Reconstruction/neighbor mix retuned from 60/40 to 70/300.21601264 min · $36.85
  80. v79Mix retuned to 80% MLP reconstruction / 20% neighbors0.21611267 min · $37.37
  81. v80Mix retuned to 90% MLP / 10% neighbors0.21575270 min · $37.89
  82. v8180/20 model on partition seed 19910.2163273 min · $38.62
  83. v8280/20 model on partition seed 29910.21642277 min · $39.35
  84. v83Calibration MLP activation changed from ReLU to tanh0.21532280 min · $39.89
  85. v84MLP trained on residual factor targets after the linear map, 100 epochs0.21593282 min · $40.42
  86. v85Residual MLP allowed 200 epochs; early-stopped to the same predictions0.21593286 min · $41.18
  87. v86Direct MLP init/validation seed changed from 808 to 18080.21589291 min · $42.15
  88. v87Two direct plus one residual MLP over one shared peak screen0.217294 min · $42.92
  89. v88Triple-calibrator model on partition seed 19910.21728299 min · $43.91
  90. v89MLP calibration replaced by 160 extremely randomized trees, leaf 120.21419303 min · $44.69
  91. v90Tree calibrator on partition seed 19910.21424306 min · $45.47
  92. v91ExtraTrees minimum leaf raised from 12 to 300.21306308 min · $46.04
  93. v92ExtraTrees minimum leaf lowered to 50.21483310 min · $46.83
  94. v93Neighbor transfer keyed on MLP-predicted rather than linear factors0.21612313 min · $47.40
  95. v94True calibration RNA factors as references against MLP test embeddings0.21484316 min · $48.00
  96. v95Ridge decoding from MLP embeddings straight to all 2,000 rank targets0.21395320 min · $48.81
  97. v96Direct decoder ridge raised from 100 to 1,0000.21472325 min · $50.24
  98. v97Reconstruction/neighbor weight set per gene by its training mean bin0.21654331 min · $51.08
  99. v98Prevalence-adaptive weights across the four-way 64-factor ensemble0.21851337 min · $52.29
  100. v9975% peak screen / 25% calibration reference0.21579350 min · $54.62
  101. v100Calibration/reference enlarged to 50% for the prevalence-adaptive model0.21751353 min · $55.24
  102. v101Second 50/50 partition, seed 19910.21746357 min · $56.10
  103. v102Third 50/50 partition, seed 29910.21757361 min · $56.98
  104. v103Shared-factor three-way 50/50 ensemble0.2191366 min · $57.98
  105. v10440% peak screen / 60% calibration reference0.21722378 min · $60.13
  106. v105Seed-991 halves swapped so every cell serves both roles across the pair0.21746383 min · $61.28
  107. v106Complementary half of partition seed 19910.21739390 min · $62.71
  108. v107Three members: one complete complementary pair plus an independent half0.21925394 min · $63.75
  109. v108Random orthogonal rotation of the whitened 64-d RNA PCA space0.2174410 min · $65.14
  110. v109Second screen of 16,384 peaks per factor against the factor residual0.20058414 min · $65.50
  111. v110Residual peak scores exposed as extra optional calibrator inputs0.21733418 min · $65.85
  112. v111One residual-feature member swapped into the v107 ensemble0.21941426 min · $66.66
  113. v112Residual screen cut from 16,384 to 4,096 peaks per factor0.21725439 min · $67.73
  114. v113Independent branch: transductive TF-IDF/LSI embedding over 65,536 peaks0.2156448 min · $68.65
  115. v114LSI compressed to 32,768 peaks, 48 dimensions, two power iterations0.20951451 min · $69.11

Killed by an API quota error at 453 min and $69.31; what was graded is whatever main/ held then, not a deliberate hand-in.

On the hidden set

held-out metricreward
Gene Activity baseline0.06100.00
EpiFoundation SOTA0.42210.50
perfect correlation1.00001.00
this run0.21620.215