Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
a6b1639
correct Within calculation
Nov 18, 2021
fa4da8b
update unit tests
Nov 18, 2021
3246567
conflicts resolved back to upstream
Feb 4, 2022
a018d4d
Merge remote-tracking branch 'upstream/master'
Feb 15, 2022
15a37d0
Merge remote-tracking branch 'upstream/master'
Feb 17, 2022
892fa45
this is the spot
Feb 18, 2022
211013c
Merge remote-tracking branch 'upstream/master'
Feb 25, 2022
68104ee
Merge branch 'master' of https://github.com/trishorts/mzLib
trishorts Mar 9, 2022
d715a08
Merge remote-tracking branch 'upstream/master'
Mar 16, 2022
3565522
Merge remote-tracking branch 'upstream/master'
Mar 23, 2022
72e7b53
Merge remote-tracking branch 'upstream/master'
Mar 29, 2022
593872a
Merge remote-tracking branch 'upstream/master'
trishorts Apr 13, 2022
42dd034
Merge branch 'master' of https://github.com/trishorts/mzLib
trishorts Apr 13, 2022
fbeaec0
Merge remote-tracking branch 'upstream/master'
trishorts Jun 1, 2022
614ded7
Merge remote-tracking branch 'upstream/master'
Jun 14, 2022
47307c8
Merge branch 'master' of https://github.com/trishorts/mzLib
Jun 14, 2022
28e05ae
Merge remote-tracking branch 'upstream/master'
Jul 6, 2022
0a7c609
Merge remote-tracking branch 'upstream/master'
Jul 26, 2022
630d8c7
Merge remote-tracking branch 'upstream/master'
trishorts Jul 27, 2022
f6a386b
Merge branch 'master' of https://github.com/trishorts/mzLib
trishorts Jul 27, 2022
d673800
Merge remote-tracking branch 'upstream/master'
Sep 11, 2022
675a0ae
Merge branch 'master' of https://github.com/trishorts/mzLib
Sep 11, 2022
15d4baf
Merge remote-tracking branch 'upstream/master'
Sep 27, 2022
03ca9f7
Merge remote-tracking branch 'upstream/master'
Oct 4, 2022
d0a4c79
Merge remote-tracking branch 'upstream/master'
Jan 30, 2023
894b998
Merge remote-tracking branch 'upstream/master'
Mar 15, 2023
dd0c8c9
Merge remote-tracking branch 'upstream/master'
Sep 26, 2024
c6310ae
Merge remote-tracking branch 'upstream/master'
Mar 4, 2026
34063e7
Merge remote-tracking branch 'upstream/master' into mzlib_speclib
Mar 14, 2026
f403791
msl foundation
Mar 14, 2026
3c34038
msl writer
Mar 15, 2026
c85bd81
reader
Mar 15, 2026
800b102
some more tests
Mar 15, 2026
f21a1ab
more tests
Mar 15, 2026
d9f0ce6
benchmark complete
Mar 15, 2026
3144511
custom neutral loss
Mar 15, 2026
dd924ff
compression
Mar 15, 2026
3c2fa47
compression complete
Mar 15, 2026
5cff2cd
streaming
Mar 15, 2026
60ec12a
koina connections
Mar 15, 2026
db7efc8
proteoforms who would have thought
Mar 15, 2026
7b1f46b
proteoform scoring
Mar 16, 2026
15c5709
msl merger
Mar 16, 2026
2e76bc1
python and rust readers for msl
Mar 16, 2026
c31d833
msl test coverage
Mar 16, 2026
eba2b4e
fix test
Mar 16, 2026
aa8b74b
coverage gaps
Mar 16, 2026
f432c0a
polish prompts
Mar 17, 2026
ffe6dac
koina
Mar 17, 2026
0d2366f
mslmerger
Mar 17, 2026
75de486
chore: ignore BenchmarkDotNet.Artifacts output directory
Mar 18, 2026
1aa4d8d
a little help from copilot
Mar 18, 2026
4434d9d
only happens in github
Mar 18, 2026
220b8d7
write streaming
Mar 18, 2026
c8ec65b
wrap up lurking bugs
Mar 18, 2026
ef9b66e
remove unused class
Mar 19, 2026
bc0bdd7
more unused code
Mar 19, 2026
43524d5
test mslstructs
Mar 19, 2026
e8ed559
eliminate more unused code
Mar 19, 2026
bcf57c9
spectrallibrary tests
Mar 19, 2026
8270d64
mslreader coverage
Mar 19, 2026
d3a1b20
write msp or msl depends on file extension in koina
Mar 20, 2026
fd9e0db
msp loaded for bear as msl
Mar 20, 2026
f0e1aa9
tests for stripped modification
Mar 21, 2026
35aecdb
null sequence guard
Mar 21, 2026
b80f7aa
be gentle
Mar 21, 2026
46c6424
normalize retention time of incoming spectra to existing library
Mar 22, 2026
8542188
variable naming consistency
Mar 22, 2026
88244a1
nics review respnse
trishorts Mar 26, 2026
9bd1e0b
internal review
Mar 28, 2026
c383e74
merge upstream
Mar 28, 2026
e909066
review fixes
Mar 28, 2026
202e6ac
Merge remote-tracking branch 'smith/master' into mzlib_speclib
trishorts Jun 8, 2026
0f8caa6
fix: qualify SpectralLibrary type in merged Prosit2020 test (namespac…
trishorts Jun 8, 2026
eeec6a0
perf(msl): defer the sequence/charge index so LoadIndexOnly does no f…
trishorts Jun 9, 2026
89e8c02
perf(chronologer): batched RetentionTimePredictorEquivalents for many…
trishorts Jun 9, 2026
8a249d1
test(msl): cover the deferred sequence/charge index (LoadIndexOnly la…
trishorts Jun 10, 2026
5d8dcf8
fix(msl): skip NaN-m/z prefix in MslIndex m/z queries
trishorts Jun 10, 2026
7ccacdf
chore(development): untrack committed BenchmarkDotNet.Artifacts results
Jun 10, 2026
0826b30
test(msl): assert internal-ion secondary annotation survives ReadFrag…
Jun 10, 2026
9d630e0
docs(msl): clarify proteoform scorer reports library reference peaks
Jun 10, 2026
17b45a8
style(speclib): restore space indentation, dropping tab-reindent churn
Jun 10, 2026
f215f04
chore: drop unrelated test changes from the .msl PR
Jun 10, 2026
d1eb53e
chore(msl): remove agent-residue comments and internal "Prompt N" refs
Jun 10, 2026
92754ed
refactor(msl-tests): rename PromptN fixtures and strip prompt-process…
Jun 10, 2026
0a6b6b4
chore: restore mzLib.nuspec version to 1.0.574
Jun 10, 2026
bdbc247
refactor(rt): drop batched Chronologer PredictRetentionTimeEquivalent…
Jun 10, 2026
2dcf742
fix(chronologer): dispose forward() intermediates to stop native-heap…
trishorts Jun 11, 2026
1fe6f85
test(rtpred): tolerate float32 batch-vs-single drift in Chronologer
trishorts Jun 15, 2026
6b18e92
refactor(chronologer): drop env-var CUDA switch from the batched pred…
trishorts Jun 15, 2026
ffe67c9
docs(msl): clarify MslFragmentIon vs MatchedFragmentIon + round-trip …
trishorts Jun 15, 2026
ddf7b22
feat(msldbbuilder): add FASTA->.msl spectral-library builder for Many…
trishorts Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -256,3 +256,11 @@ ModelManifest.xml

# Macintosh files
**/.DS_Store

/.claude
/.opencode
/.opencode/config/coverage.json
/AGENTS.md
# BenchmarkDotNet artifacts - machine-specific, regenerated on every run
**/BenchmarkDotNet.Artifacts/

Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,96 @@ protected override bool ValidateBasicConstraints(IRetentionPredictable peptide,
// Predict retention time - keep both prediction AND disposal inside lock
lock (_modelLock)
{
using Tensor prediction = _model.Predict(sequenceTensor);
using var scope = NewDisposeScope(); // dispose forward()'s intermediates deterministically
using Tensor prediction = _model.Predict(sequenceTensor).cpu();
return prediction[0].ToDouble();
}
}

/// <summary>
/// Batched override: formats/encodes the peptides in parallel (CPU) and runs the Chronologer model in
/// large batched forward passes instead of one locked batch-1 call per peptide. The model is in eval
/// mode (BatchNorm uses running statistics), so each peptide's prediction is independent of the batch —
/// results match <see cref="PredictCore"/> to float32 precision (libtorch selects different conv/matmul
/// kernels at batch size m vs 1, so the two paths are not bit-identical), just far faster for many peptides.
/// </summary>
public override IReadOnlyList<(double? PredictedValue, IRetentionPredictable Peptide, RetentionTimeFailureReason? FailureReason)>
PredictRetentionTimeEquivalents(IEnumerable<IRetentionPredictable> peptides, int maxThreads = 1)
{
if (_disposed)
throw new ObjectDisposedException(nameof(ChronologerRetentionTimePredictor));

var list = peptides as IReadOnlyList<IRetentionPredictable> ?? peptides.ToList();
int n = list.Count;
int encodedLength = ChronologerSequenceFormatSchema.EncodedLength;
var results = new (double?, IRetentionPredictable, RetentionTimeFailureReason?)[n];
var encoded = new long[n][]; // null when the peptide could not be encoded
var reasons = new RetentionTimeFailureReason?[n];

// Phase 1 — format + integer-encode each peptide in parallel (pure CPU, no model access).
System.Threading.Tasks.Parallel.For(0, n,
new System.Threading.Tasks.ParallelOptions { MaxDegreeOfParallelism = Math.Max(1, maxThreads) }, i =>
{
var pep = list[i];
if (!ValidateBasicConstraints(pep, out RetentionTimeFailureReason? basicReason))
{
reasons[i] = basicReason;
return;
}
string? formatted = GetFormattedSequence(pep, out RetentionTimeFailureReason? fmtReason);
if (formatted == null)
{
reasons[i] = fmtReason ?? RetentionTimeFailureReason.PredictionError;
return;
}
var ids = new long[encodedLength]; // zero-padded
for (int k = 0; k < formatted.Length; k++)
{
if (!CodeToInt.TryGetValue(formatted[k], out int v)) { ids = null!; break; }
ids[k] = v;
}
if (ids == null) { reasons[i] = RetentionTimeFailureReason.PredictionError; return; }
encoded[i] = ids;
});

var valid = new List<int>(n);
for (int i = 0; i < n; i++) if (encoded[i] != null) valid.Add(i);

// Phase 2 — batched model inference. One forward pass per chunk (model lock held once per chunk).
const int chunkSize = 2048;
lock (_modelLock)
{
using var noGrad = no_grad();
for (int off = 0; off < valid.Count; off += chunkSize)
{
// Deterministically dispose every tensor created during this chunk — including the ~30
// intermediates allocated inside the model's forward() (residual clones, conv/norm outputs).
// Without a dispose scope those rely on the GC finalizer thread, which races the main thread's
// libtorch allocator and corrupts the native heap (0xC0000374) once enough inference has run.
using var scope = NewDisposeScope();
int m = Math.Min(chunkSize, valid.Count - off);
var flat = new long[(long)m * encodedLength];
for (int j = 0; j < m; j++)
Array.Copy(encoded[valid[off + j]], 0, flat, (long)j * encodedLength, encodedLength);

using Tensor input = tensor(flat, dtype: ScalarType.Int64).reshape(m, encodedLength);
using Tensor prediction = _model.Predict(input); // [m, 1]
double[] preds = prediction.reshape(m).to(ScalarType.Float64).cpu().data<double>().ToArray();
for (int j = 0; j < m; j++)
{
int i = valid[off + j];
results[i] = (preds[j], list[i], null);
}
}
}

for (int i = 0; i < n; i++)
if (encoded[i] == null)
results[i] = ((double?)null, list[i], reasons[i]);

return results;
}

public override string? GetFormattedSequence(IRetentionPredictable peptide, out RetentionTimeFailureReason? failureReason)
{
failureReason = null;
Expand Down
1 change: 1 addition & 0 deletions mzLib/Development/Development.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
<PackageReference Include="CsvHelper" Version="32.0.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="NUnit" Version="4.1.0" />
Expand Down
Loading
Loading