Skip to content

Upgrade to ScienceBeam Trainer DeLFT v1.x (PyTorch) - #695

Merged
de-code merged 7 commits into
mainfrom
upgrade-to-trainer-delft-1-0
Aug 18, 2026
Merged

Upgrade to ScienceBeam Trainer DeLFT v1.x (PyTorch)#695
de-code merged 7 commits into
mainfrom
upgrade-to-trainer-delft-1-0

Conversation

@de-code

@de-code de-code commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

The trainer and the parser have to agree on a weight format: every model the trainer
now produces is a torch state dict, and the 0.0.x pin cannot load one, so serving a
freshly trained model needs this first. The 0.0.x line is also closed to security and
maintenance updates.

Model URLs are unchanged. TF-era model_weights.hdf5 stays supported input — delft
converts it to a torch state dict in memory on load and never touches the model
directory.

What changes

sciencebeam-trainer-delft 0.0.381.0.1
delft 0.4.31.0.1
torch / torchvision 2.5.12.11.0+cpu / 0.20.10.26.0+cpu
removed from the graph tensorflow, tf-keras, tfa-nightly, keras, tensorboard, libclang, ml-dtypes, pydot
added pytorch-crf, sentencepiece; transformers 4.48.05.7.0
CUDA payload none — no nvidia-*, no triton

Both runtime images now set SCIENCEBEAM_DELFT_DEVICE=cpu, overridable from the
environment. delft 1.0 picks CUDA whenever torch sees a GPU, and an inference image
should not change device because of the host it lands on. 1.0.1 is the floor because it
is the first release that validates that variable and logs the device it resolved.

Linux arm64 installs --extra delft like every other platform, and its special-cased
step goes: it existed because TensorFlow had no arm64 wheels, and it installed
sciencebeam-trainer-delft outside the lock, making arm64 the one job not testing the
locked version. Its selection widens to match macOS — the whole suite minus
cv_models — and both native jobs deselect slow.

torch stays declared in the cpu extra rather than left to arrive through delft. That
declaration is what binds [tool.uv.sources] to the package name across the lock; uv
applies a source to a direct dependency, so removing those lines as redundant would let
torch resolve from PyPI, where the Linux wheel carries four nvidia-* packages and
triton.

A new case at tests/models/delft_model_impl_test.py loads a converted TF-era model and
tags with it — nothing covered that path here, since CI stopped exercising delft when the
default profile became wapiti. It uses the biorxiv_elife header release, which needs no
word embeddings, so it exercises the conversion and nothing else. Marked slow because it
downloads 6.6 MB; the Docker pytest target runs it and the native jobs skip it.

Parity with the TensorFlow build

biorxiv_elife at smoke, 60 documents across six corpora, run on this branch
(pr-695-5a9661fa) and on a branch off main still carrying TensorFlow
(pr-696-05c18a70). 146 of 147 metric rows are
identical, the overall section over all 60 documents included. One row differs: ore,
reference_title (edit_sim), partial_list, 0.340 on TensorFlow against 0.339 on torch.
reference_title (levenshtein) over the same field and corpus is unchanged at 0.315, so
whatever differs is too small to move a match decision and washes out of the overall
figures — a float-level difference in one reference title in one of ten ore documents.
Accepted as measured, not traced to a document.

Every model the trainer now produces is a torch state dict, and the 0.0.x
pin cannot load one, so serving a freshly trained model needs this first.
The 0.0.x line is also closed to security and maintenance updates.

TF-era `model_weights.hdf5` stays supported input: delft converts it to a
torch state dict in memory on load and never touches the directory, so the
model URLs in the shipped config are unchanged. Upstream measured the
conversion against a reference capture for the eight CustomBidLSTM_CRF
models the biorxiv_elife profile serves, which is why parity is not
re-measured here.

The graph loses tensorflow, tf-keras, tfa-nightly, keras, tensorboard,
libclang, ml-dtypes and pydot, and gains pytorch-crf and sentencepiece;
torch moves to 2.11.0 and torchvision to 0.26.0.

torch stays declared in the cpu extra rather than left to arrive through
delft. That declaration is what binds [tool.uv.sources] to the package name
across the whole lock: uv applies a source to a direct dependency, so
removing these lines as redundant - delft requires torch==2.11.0 on its own
- would let torch resolve from PyPI instead, where the Linux wheel carries
four nvidia-* packages and triton. The floors are raised to what actually
resolves, since >=2.5.1 said nothing next to delft's exact pin.

trainer-delft's own cpu extra is deliberately not requested. It re-pins
torch==2.11.0, which delft requires anyway, and its index selection does
not propagate to a consumer.

The tf extra is removed. Nothing here installed it and it existed only to
add TensorFlow for the delft engine, but it is published metadata, so it
belongs in the release notes.
delft 1.0 picks CUDA whenever torch sees a GPU, where the TensorFlow-era
path was CPU unless configured otherwise. An inference image should not
change device because of the host it lands on.

SCIENCEBEAM_DELFT_DEVICE is the whole mechanism, since Sequence is
constructed here without a device argument. Set as an image default rather
than baked in, so a GPU variant stays possible and an operator can override
it per deployment.
The job installed sciencebeam-trainer-delft outside the lock and ran a
hand-picked subset, because TensorFlow had no arm64 wheels and the delft
extra would not install. Every distribution in that extra now has an
aarch64 wheel, torch included, so arm64 installs like every other platform
and stops being the one job testing an unlocked version.

The selection widens to match macOS: the whole suite minus cv_models. Both
native jobs now also deselect slow, which covers the cases that download
model artifacts - the Docker pytest target runs those.
Upstream measured the conversion's scores, but nothing showed the load path
works in this package's environment, and CI stopped exercising it when the
default profile became wapiti.

The biorxiv_elife header release is the model that exercises conversion and
nothing else: TF-era model_weights.hdf5, and no word embeddings, so it needs
nothing from the embedding registry. Loading the whole profile would be the
wrong shape for CI, since its other models resolve glove-840B.

The case goes through DelftModelImpl rather than the models API. The router
is already covered by mocked tests and the default profile is wapiti, so a
router-level case would need a config override to reach a delft model at
all; the load-and-convert path is what was unproven.

Input comes from HeaderDataGenerator rather than a hand-written feature
matrix, which would risk a width mismatch against the model's config.json
and fail for a reason unrelated to the upgrade. Assertions are shape only -
a pair per token, labels drawn from the model's own set - because asserting
particular labels would re-measure parity here and tie the test to output
upstream has already checked.

Marked slow: it downloads 6.6 MB, so the native jobs deselect it.
The delft extra pulls in torch, and on Linux the default PyPI wheel is the
CUDA build. This project's index configuration is not part of its published
metadata, so it cannot reach a downstream consumer; documentation is the
only mechanism available.

The non-obvious part is not the index block but that torch has to be
declared as a direct dependency for a uv source to apply. A project that
receives torch only through sciencebeam-parser has no binding at all, which
is the same reason the cpu extra keeps its torch line.

Also states that there is no TensorFlow extra and that model URLs need no
change, since TF-era artifacts are converted on load.
@de-code de-code self-assigned this Aug 17, 2026
1.0.1 is the first release that validates SCIENCEBEAM_DELFT_DEVICE and logs
the device it resolved. Both runtime images set that variable, and until now
a typo in it surfaced deep inside a tensor move rather than at construction,
while a correct value left no record of which device was actually used. The
floor states that dependency rather than leaving it to whatever resolves.

It also drops the cpu and gpu extras, which were byte-identical once
published and so promised a wheel choice they could not make. Nothing here
requested them - torch is bound to the CPU index through this project's own
direct declaration - so the resolution is unchanged: delft stays 1.0.1 and
torch stays 2.11.0+cpu.
@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown

ScienceBeam Parser Evaluation

Overall (60 docs across 6 corpora)

grobid 0.9.0-crf (default): 60 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 60 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 60 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.582 0.572 0.572 -0.010 +0.000
title (levenshtein) string 0.657 0.657 0.657 +0.000 +0.000
title (edit_sim) string 0.701 0.701 0.701 +0.000 +0.000
abstract (levenshtein) string 0.709 0.709 0.709 +0.000 +0.000
abstract (edit_sim) string 0.721 0.716 0.716 -0.005 +0.000
author_full_names (levenshtein) partial_ulist 0.720 0.706 0.706 -0.014 +0.000
author_full_names (edit_sim) partial_ulist 0.746 0.735 0.735 -0.012 +0.000
affiliation_text (levenshtein) partial_ulist 0.471 0.446 0.446 -0.025 +0.000
affiliation_text (edit_sim) partial_ulist 0.582 0.544 0.544 -0.039 +0.000
keywords (levenshtein) partial_ulist 0.766 0.000 0.000 -0.766 +0.000
keywords (edit_sim) partial_ulist 0.695 0.000 0.000 -0.695 +0.000
body_section_titles (levenshtein) partial_list 0.346 0.328 0.328 -0.018 +0.000
body_section_titles (edit_sim) partial_list 0.353 0.345 0.345 -0.008 +0.000
acknowledgement (levenshtein) string 0.474 0.361 0.361 -0.113 +0.000
acknowledgement (edit_sim) string 0.473 0.356 0.356 -0.117 +0.000
first_reference_text (levenshtein) string 0.552 0.552 0.552 +0.000 +0.000
first_reference_text (edit_sim) string 0.667 0.666 0.666 -0.001 +0.000
reference_title (levenshtein) partial_list 0.455 0.466 0.466 +0.011 +0.000
reference_title (edit_sim) partial_list 0.462 0.480 0.480 +0.019 +0.000
reference_doi (levenshtein) partial_ulist 0.711 0.567 0.567 -0.144 +0.000
reference_doi (edit_sim) partial_ulist 0.668 0.532 0.532 -0.136 +0.000
biorxiv (10 docs)

grobid 0.9.0-crf (default): 10 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 10 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 10 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.947 0.889 0.889 -0.058 +0.000
title (levenshtein) string 1.000 1.000 1.000 +0.000 +0.000
title (edit_sim) string 1.000 1.000 1.000 +0.000 +0.000
abstract (levenshtein) string 0.750 0.750 0.750 +0.000 +0.000
abstract (edit_sim) string 0.754 0.755 0.755 +0.001 +0.000
author_full_names (levenshtein) partial_ulist 0.994 0.994 0.994 +0.000 +0.000
author_full_names (edit_sim) partial_ulist 0.972 0.972 0.972 +0.000 +0.000
affiliation_text (levenshtein) partial_ulist 0.873 0.842 0.842 -0.031 +0.000
affiliation_text (edit_sim) partial_ulist 0.846 0.817 0.817 -0.029 +0.000
keywords (levenshtein) partial_ulist 0.966 0.000 0.000 -0.966 +0.000
keywords (edit_sim) partial_ulist 0.951 0.000 0.000 -0.951 +0.000
body_section_titles (levenshtein) partial_list 0.275 0.277 0.277 +0.002 +0.000
body_section_titles (edit_sim) partial_list 0.294 0.302 0.302 +0.007 +0.000
acknowledgement (levenshtein) string 0.875 0.500 0.500 -0.375 +0.000
acknowledgement (edit_sim) string 0.836 0.502 0.502 -0.333 +0.000
first_reference_text (levenshtein) string 0.947 0.947 0.947 +0.000 +0.000
first_reference_text (edit_sim) string 0.913 0.913 0.913 +0.000 +0.000
reference_title (levenshtein) partial_list 0.702 0.804 0.804 +0.102 +0.000
reference_title (edit_sim) partial_list 0.660 0.764 0.764 +0.104 +0.000
reference_doi (levenshtein) partial_ulist 0.964 0.942 0.942 -0.021 +0.000
reference_doi (edit_sim) partial_ulist 0.932 0.931 0.931 -0.001 +0.000
ore (10 docs)

grobid 0.9.0-crf (default): 10 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 10 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 10 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.667 0.667 0.667 +0.000 +0.000
title (levenshtein) string 0.750 0.750 0.750 +0.000 +0.000
title (edit_sim) string 0.840 0.840 0.840 +0.000 +0.000
abstract (levenshtein) string 0.824 0.824 0.824 +0.000 +0.000
abstract (edit_sim) string 0.805 0.807 0.807 +0.002 +0.000
author_full_names (levenshtein) partial_ulist 0.783 0.777 0.777 -0.006 +0.000
author_full_names (edit_sim) partial_ulist 0.775 0.770 0.770 -0.006 +0.000
affiliation_text (levenshtein) partial_ulist 0.565 0.517 0.517 -0.048 +0.000
affiliation_text (edit_sim) partial_ulist 0.574 0.522 0.522 -0.052 +0.000
keywords (levenshtein) partial_ulist 0.500 0.000 0.000 -0.500 +0.000
keywords (edit_sim) partial_ulist 0.446 0.000 0.000 -0.446 +0.000
body_section_titles (levenshtein) partial_list 0.279 0.323 0.323 +0.044 +0.000
body_section_titles (edit_sim) partial_list 0.298 0.343 0.343 +0.045 +0.000
acknowledgement (levenshtein) string 0.833 0.833 0.833 +0.000 +0.000
acknowledgement (edit_sim) string 0.870 0.802 0.802 -0.068 +0.000
first_reference_text (levenshtein) string 0.333 0.333 0.333 +0.000 +0.000
first_reference_text (edit_sim) string 0.528 0.528 0.528 +0.000 +0.000
reference_title (levenshtein) partial_list 0.228 0.284 0.284 +0.056 +0.000
reference_title (edit_sim) partial_list 0.265 0.315 0.315 +0.050 +0.000
reference_doi (levenshtein) partial_ulist 0.704 0.012 0.012 -0.692 +0.000
reference_doi (edit_sim) partial_ulist 0.558 0.003 0.003 -0.556 +0.000
pkp (10 docs)

grobid 0.9.0-crf (default): 10 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 10 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 10 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.750 0.750 0.750 +0.000 +0.000
title (levenshtein) string 0.824 0.824 0.824 +0.000 +0.000
title (edit_sim) string 0.805 0.805 0.805 +0.000 +0.000
abstract (levenshtein) string 0.933 0.933 0.933 +0.000 +0.000
abstract (edit_sim) string 0.914 0.915 0.915 +0.001 +0.000
author_full_names (levenshtein) partial_ulist 0.905 0.905 0.905 +0.000 +0.000
author_full_names (edit_sim) partial_ulist 0.917 0.917 0.917 +0.000 +0.000
affiliation_text (levenshtein) partial_ulist 0.667 0.600 0.600 -0.067 +0.000
affiliation_text (edit_sim) partial_ulist 0.743 0.666 0.666 -0.077 +0.000
keywords (levenshtein) partial_ulist 1.000 0.000 0.000 -1.000 +0.000
keywords (edit_sim) partial_ulist 1.000 0.000 0.000 -1.000 +0.000
body_section_titles (levenshtein) partial_list 0.678 0.714 0.714 +0.036 +0.000
body_section_titles (edit_sim) partial_list 0.650 0.685 0.685 +0.035 +0.000
acknowledgement (levenshtein) string 0.800 0.500 0.500 -0.300 +0.000
acknowledgement (edit_sim) string 0.800 0.500 0.500 -0.300 +0.000
first_reference_text (levenshtein) string 1.000 1.000 1.000 +0.000 +0.000
first_reference_text (edit_sim) string 0.995 0.995 0.995 +0.000 +0.000
reference_title (levenshtein) partial_list 0.799 0.770 0.770 -0.029 +0.000
reference_title (edit_sim) partial_list 0.770 0.740 0.740 -0.030 +0.000
reference_doi (levenshtein) partial_ulist 0.889 0.889 0.889 +0.000 +0.000
reference_doi (edit_sim) partial_ulist 0.889 0.889 0.889 +0.000 +0.000
scielo_br (10 docs)

grobid 0.9.0-crf (default): 10 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 10 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 10 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.462 0.462 0.462 +0.000 +0.000
title (levenshtein) string 0.571 0.571 0.571 +0.000 +0.000
title (edit_sim) string 0.628 0.628 0.628 +0.000 +0.000
abstract (levenshtein) string 0.750 0.750 0.750 +0.000 +0.000
abstract (edit_sim) string 0.697 0.692 0.692 -0.005 +0.000
author_full_names (levenshtein) partial_ulist 0.582 0.500 0.500 -0.082 +0.000
author_full_names (edit_sim) partial_ulist 0.635 0.566 0.566 -0.069 +0.000
affiliation_text (levenshtein) partial_ulist 0.000 0.000 0.000 +0.000 +0.000
affiliation_text (edit_sim) partial_ulist 0.357 0.299 0.299 -0.059 +0.000
keywords (levenshtein) partial_ulist 0.614 0.000 0.000 -0.614 +0.000
keywords (edit_sim) partial_ulist 0.544 0.000 0.000 -0.544 +0.000
body_section_titles (levenshtein) partial_list 0.449 0.271 0.271 -0.178 +0.000
body_section_titles (edit_sim) partial_list 0.485 0.354 0.354 -0.131 +0.000
acknowledgement (levenshtein) string 0.000 0.000 0.000 +0.000 +0.000
acknowledgement (edit_sim) string 0.000 0.000 0.000 +0.000 +0.000
first_reference_text (levenshtein) string 0.000 0.000 0.000 +0.000 +0.000
first_reference_text (edit_sim) string 0.391 0.369 0.369 -0.022 +0.000
reference_title (levenshtein) partial_list 0.443 0.457 0.457 +0.013 +0.000
reference_title (edit_sim) partial_list 0.451 0.468 0.468 +0.017 +0.000
reference_doi (levenshtein) partial_ulist 0.965 0.824 0.824 -0.141 +0.000
reference_doi (edit_sim) partial_ulist 0.960 0.718 0.718 -0.242 +0.000
scielo_mx (10 docs)

grobid 0.9.0-crf (default): 10 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 10 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 10 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.333 0.333 0.333 +0.000 +0.000
title (levenshtein) string 0.462 0.462 0.462 +0.000 +0.000
title (edit_sim) string 0.520 0.520 0.520 +0.000 +0.000
abstract (levenshtein) string 0.333 0.333 0.333 +0.000 +0.000
abstract (edit_sim) string 0.550 0.522 0.522 -0.027 +0.000
author_full_names (levenshtein) partial_ulist 0.627 0.627 0.627 +0.000 +0.000
author_full_names (edit_sim) partial_ulist 0.659 0.659 0.659 +0.000 +0.000
affiliation_text (levenshtein) partial_ulist 0.100 0.095 0.095 -0.005 +0.000
affiliation_text (edit_sim) partial_ulist 0.287 0.296 0.296 +0.009 +0.000
keywords (levenshtein) partial_ulist 0.814 0.000 0.000 -0.814 +0.000
keywords (edit_sim) partial_ulist 0.692 0.000 0.000 -0.692 +0.000
body_section_titles (levenshtein) partial_list 0.000 0.000 0.000 +0.000 +0.000
body_section_titles (edit_sim) partial_list 0.000 0.000 0.000 +0.000 +0.000
acknowledgement (levenshtein) string 0.000 0.000 0.000 +0.000 +0.000
acknowledgement (edit_sim) string 0.000 0.000 0.000 +0.000 +0.000
first_reference_text (levenshtein) string 0.571 0.571 0.571 +0.000 +0.000
first_reference_text (edit_sim) string 0.547 0.557 0.557 +0.010 +0.000
reference_title (levenshtein) partial_list 0.264 0.249 0.249 -0.014 +0.000
reference_title (edit_sim) partial_list 0.304 0.302 0.302 -0.001 +0.000
reference_doi (levenshtein) partial_ulist 0.000 0.000 0.000 +0.000 +0.000
reference_doi (edit_sim) partial_ulist 0.000 0.000 0.000 +0.000 +0.000
scielo_preprints-jats (10 docs)

grobid 0.9.0-crf (default): 10 docs | sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf): 10 docs | sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf): 10 docs

Field (method) Type grobid 0.9.0-crf (default) sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf) sciencebeam-parser:pr-695-33ee27ec-20260818.1216 (grobid_crf) Δ grobid 0.9.0-crf (default) Δ sciencebeam-parser:main-596b4687-20260818.1053 (grobid_crf)
title (exact) string 0.333 0.333 0.333 +0.000 +0.000
title (levenshtein) string 0.333 0.333 0.333 +0.000 +0.000
title (edit_sim) string 0.411 0.411 0.411 +0.000 +0.000
abstract (levenshtein) string 0.667 0.667 0.667 +0.000 +0.000
abstract (edit_sim) string 0.606 0.605 0.605 -0.000 +0.000
author_full_names (levenshtein) partial_ulist 0.431 0.435 0.435 +0.004 +0.000
author_full_names (edit_sim) partial_ulist 0.521 0.525 0.525 +0.004 +0.000
affiliation_text (levenshtein) partial_ulist 0.620 0.621 0.621 +0.001 +0.000
affiliation_text (edit_sim) partial_ulist 0.688 0.662 0.662 -0.026 +0.000
keywords (levenshtein) partial_ulist 0.704 0.000 0.000 -0.704 +0.000
keywords (edit_sim) partial_ulist 0.535 0.000 0.000 -0.535 +0.000
body_section_titles (levenshtein) partial_list 0.393 0.383 0.383 -0.010 +0.000
body_section_titles (edit_sim) partial_list 0.393 0.385 0.385 -0.008 +0.000
acknowledgement (levenshtein) string 0.333 0.333 0.333 +0.000 +0.000
acknowledgement (edit_sim) string 0.333 0.333 0.333 +0.000 +0.000
first_reference_text (levenshtein) string 0.462 0.462 0.462 +0.000 +0.000
first_reference_text (edit_sim) string 0.627 0.632 0.632 +0.005 +0.000
reference_title (levenshtein) partial_list 0.297 0.235 0.235 -0.062 +0.000
reference_title (edit_sim) partial_list 0.319 0.291 0.291 -0.028 +0.000
reference_doi (levenshtein) partial_ulist 0.744 0.735 0.735 -0.008 +0.000
reference_doi (edit_sim) partial_ulist 0.670 0.653 0.653 -0.016 +0.000

@de-code
de-code merged commit 82847ea into main Aug 18, 2026
8 checks passed
@de-code
de-code deleted the upgrade-to-trainer-delft-1-0 branch August 18, 2026 12:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant