Investigations
Research projects
Research projects, each built to answer a specific question.
DNA-Entropy-Graph
C#WinUI 3PythonEvo 2Google Cloud
DNA-Entropy scores every base of a DNA sequence with Evo 2, a genomic language model, and returns a Shannon entropy value for each one, from 0 to 2 bits, as a track that opens in IGV, Geneious, SnapGene or Benchling. Before it, the Meers Lab at Vanderbilt got the same picture from a BLAST alignment that took over 8 hours. A run now takes under 5 minutes.
The prototypes the lab uses. In May 2026 I started building command-line tools that take a GenBank or FASTA file, run it through Evo 2 in one forward pass, and write the entropy track plus a GenBank copy with a mean entropy noted on every gene. Evo 2 needs an NVIDIA GPU with about 24 GB of memory, so the tools run it on a GPU inside the researcher’s own Google Cloud project, and sequences and the bill never pass through a server of mine. I built two versions of the cloud side: one creates the GPU machine, runs the job and deletes it, so a run costs cents; the other keeps a machine up so every run starts at once. A local NVIDIA GPU is used when there is one. Researchers in the lab adopted the prototypes on their own sequences.
The app the lab is funding. Dr. Chance Meers approved the prototypes and is now funding a Windows app as the lab’s tool. The analysis runs the same way, behind a graphical interface with more controls: the app is C# and WinUI 3 over the same Python pipeline, rents the GPU in the researcher’s own cloud project, tracks every resource it created, and offers to delete them, because a stopped machine’s disk keeps charging. The app is under development.
PLATE I.
Your sequence runs on a GPU in your own machine or one rented in your own Google Cloud project. Neither path goes through a server of mine.
| Measurement | Result |
|---|---|
| Time to get an entropy track | over 8 hours down to under 5 minutes |
| Science pipeline tests | 810 passed, 2 skipped |
| Windows app tests | 327 passed, 1 skipped |
Engineering Identity
PythonKerasXGBoostMATLABExcel
Engineering identity is how strongly a student sees themself as an engineer. From August 2024 to June 2025 I was lead researcher on a 30-person team at UT Dallas studying it in engineering students across all four years. About 5,500 students answered the start-of-semester survey and about 3,500 the end-of-semester one. Each student also wrote three short definitions of an engineer and drew a concept map that was scored for complexity.
During the research. I built the team’s Python tooling and the scripts that cleaned the data: keyword and synonym detection across more than 27,000 written definitions, and error checking on more than 9,000 concept maps, which saved the team over 500 hours of manual review, then trained and mentored the team on that tooling and those scripts. The lab’s MATLAB ensemble of 18,900 small neural networks took from a few hours to over 48 hours per run, so I wrote a Python neural network to predict each student’s identity score instead. It reached R² 0.40 on held-out students and trained in under 20 minutes.
Checking the results in 2026. I rebuilt both original models, the MATLAB ensemble and my neural network, and scored them against new models on identical repeated cross-validation folds. Several of the original numbers did not reproduce. The MATLAB ensemble scored 0.140 on its own training data and -0.075 on held-out students, and simpler models won: a stacked ensemble reached R² 0.417 against 0.281 for the original network. Seven survey questions turned out to overlap almost directly with the score being predicted. Removing them dropped the best model to 0.294, the largest single effect in the study. Predicting how much a student’s identity changes over the semester reaches only 0.115; most students’ scores stayed close to where they started. After cleaning and matching, the models see 1,929 students at the start of the semester, 1,789 at the end, and 1,012 with both surveys.

PLATE II.
R² for each test, comparing the best new model with the original network on the same cross-validation folds. Bars average across datasets; the table below shows the best single dataset, so some of its numbers are higher.
| Measurement | Result |
|---|---|
| Replication | stacking 0.417 ± 0.040, ANN 0.281 ± 0.027 |
| Without the seven overlapping questions | stacking 0.294 ± 0.030, ANN 0.186 ± 0.029 |
| Predicting change over the semester | stacking 0.115 ± 0.051, ANN -0.018 ± 0.079 |
| Starting score only | elastic net 0.288 ± 0.049, ANN 0.136 ± 0.065 |
| Students with concept maps only | xgboost 0.133 ± 0.045, ANN -0.011 ± 0.059 |
Zero-Shot Variant Effect
PythonPyTorchTransformersHyenaDNANucleotide Transformer
Can DNA language models small enough to run on a laptop tell which mutations are harmful, with no training? I tested this by scoring each variant on how much less likely the model finds the mutated sequence than the original.
On 3,644 BRCA1 variants with lab-measured effects (Findlay et al., 2018), the answer is no. HyenaDNA and Nucleotide Transformer v2 score at or below chance. A standard conservation score, phyloP, reaches 0.826 AUROC.
The models themselves work: both recover masked bases far above chance and prefer real sequence over shuffled sequence. Their scores just carry almost no conservation signal for this gene, with a correlation to phyloP below 0.03. Small models trained on raw sequence do not seem to learn it.
1 / 2
| Measurement | Result |
|---|---|
| phyloP 100-way (not zero-shot) | AUROC 0.826 [0.809, 0.841] |
| CADD (supervised, not zero-shot) | AUROC 0.817 [0.801, 0.831] |
| order-6 Markov model | AUROC 0.465 [0.442, 0.488] |
| HyenaDNA small, 32k | AUROC 0.452 [0.430, 0.474] |
| Nucleotide Transformer v2 | AUROC 0.446 [0.426, 0.466] |


