DNA-Entropy-Graph

View on GitHub

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.

Diagram: the bring-your-own-GPU flowA sequence file starts on the researcher's own machine, and the flow then divides into two compute options. On one, the file stays on that same machine and Evo 2 runs on a discrete GPU inside it, so nothing leaves the machine. On the other, Evo 2 runs on a GPU rented inside the researcher's own Google Cloud project, shown inside a dashed boundary labelled as that project, and the rented machine is deleted once the run ends. The two options rejoin, and either way the resulting entropy track returns to the same machine, to open in IGV, Geneious, SnapGene or Benchling. No server belonging to the developer sits in either path.YOUR MACHINESEQUENCE INGenBank orFASTA fileTHE SAME MACHINELOCAL GPUEvo 2 runs herenothing leaves the machineORYOUR GOOGLE CLOUD PROJECTRENTED GPUEvo 2 runs heredeleted when the run endsYOUR MACHINEENTROPY TRACKIGV · Geneious ·SnapGene · BenchlingNo server of mine is in either path.Diagram: the bring-your-own-GPU flowA sequence file starts on the researcher's own machine, and the flow then divides into two compute options. On one, the file stays on that same machine and Evo 2 runs on a discrete GPU inside it, so nothing leaves the machine. On the other, Evo 2 runs on a GPU rented inside the researcher's own Google Cloud project, shown inside a dashed boundary labelled as that project, and the rented machine is deleted once the run ends. The two options rejoin, and either way the resulting entropy track returns to the same machine, to open in IGV, Geneious, SnapGene or Benchling. No server belonging to the developer sits in either path.YOUR MACHINESEQUENCE INGenBank or FASTA fileTHE SAMEMACHINELOCAL GPUEvo 2 runs herenothing leavesthe machineORYOUR GOOGLECLOUD PROJECTRENTED GPUEvo 2 runs heredeleted when therun endsYOUR MACHINEENTROPY TRACKIGV · Geneious ·SnapGene · Benchling

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.

DNA-Entropy-Graph results
MeasurementResult
Time to get an entropy trackover 8 hours down to under 5 minutes
Science pipeline tests810 passed, 2 skipped
Windows app tests327 passed, 1 skipped

Engineering Identity

View on GitHub

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.

Grouped bar chart of R^2 by protocol, best model in this repo versus the original neural network, with error bars. The best model, orange or blue or green depending on protocol, leads the original network, shown in red, in every one of the five protocols: P1, P2, P3, P3b and P4.

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.

Engineering Identity: R² of the best new model against the original network (ANN), best dataset in each test
MeasurementResult
Replicationstacking 0.417 ± 0.040, ANN 0.281 ± 0.027
Without the seven overlapping questionsstacking 0.294 ± 0.030, ANN 0.186 ± 0.029
Predicting change over the semesterstacking 0.115 ± 0.051, ANN -0.018 ± 0.079
Starting score onlyelastic net 0.288 ± 0.049, ANN 0.136 ± 0.065
Students with concept maps onlyxgboost 0.133 ± 0.045, ANN -0.011 ± 0.059

Zero-Shot Variant Effect

View on GitHub

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.

Zero-Shot Variant Effect: AUROC on 3,644 BRCA1 variants, with 95% confidence intervals
MeasurementResult
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 modelAUROC 0.465 [0.442, 0.488]
HyenaDNA small, 32kAUROC 0.452 [0.430, 0.474]
Nucleotide Transformer v2AUROC 0.446 [0.426, 0.466]