Skip to main content

Training-aware machine translation evaluation for MT.

Project description

TAME-MT

CI Wheels

Training-Aware Machine Translation Evaluation.

TAME-MT is a command-line tool and Python package for evaluating machine translation systems while accounting for the data they were trained on.

Standard MT metrics such as BLEU and chrF answer:

How close are the system translations to the references?

TAME-MT keeps those scores, but adds a second question:

How close is each test example to the training corpus?

That second question matters because many MT benchmarks, especially low-resource benchmarks, are built from narrow and overlapping sources: scripture, government documents, educational text, health leaflets, NGO materials, oral narratives, dictionaries, crawled web pages, or small public corpora reused across projects. A high BLEU score on a train-similar test set can be a valid in-domain result, but it is weaker evidence of broad translation ability.

TAME-MT makes this visible.

It reports ordinary system quality, a nearest-neighbor translation-memory baseline built from the training corpus, train-test exposure scores, leakage-style overlap diagnostics, and quality broken out by distance from the training data.

Contents

When To Use It

Use TAME-MT when you have:

  • a machine translation training corpus;
  • a test source file;
  • one or more reference translation files;
  • one or more system output files;
  • a need to understand whether high scores come from broad generalization or from test examples that look very close to training examples.

TAME-MT is especially useful for:

  • low-resource MT evaluation;
  • benchmark audits before publishing scores;
  • comparing several MT systems on the same train/test split;
  • finding train-test exact overlaps and near duplicates;
  • reporting whether BLEU/chrF claims are mostly supported by far-from-training examples or by near-training examples.

TAME-MT is not a replacement for BLEU, chrF, COMET, human evaluation, or error analysis. It is a training-aware layer around corpus evaluation.

What It Reports

Output Meaning
BLEU, chrF Standard corpus quality scores for the system output.
TM-BLEU, TM-chrF BLEU/chrF of a simple translation-memory baseline built from nearest training examples.
delta over TM System score minus translation-memory baseline score.
SourceExposure For each test source, similarity to the closest training source.
TargetExposure For each reference, similarity to the closest training target.
PairExposure Whether a test source/reference pair is close to the same training source/target pair.
PairLeakTopK@0.85 Fraction of test pairs whose top-k pair-reranked exposure is at least 0.85.
PairLeakExact@0.85 Optional exact no-false-negative pair-threshold rate when --exact-pair-thresholds is used.
source_exact Test source exactly appears in normalized training sources.
pair_exact Test source and reference exactly appear as a normalized training pair.
Far-BLEU, Far-chrF Quality on test examples far from the training source corpus.
GenGap-BLEU, GenGap-chrF Near-bin score minus far-bin score.

The shortest interpretation is:

  • high system score and high TM baseline means the benchmark is partly solvable by training-set nearest-neighbor reuse;
  • high delta over TM means the system is doing more than that baseline;
  • strong far-bin scores are better evidence of generalization than strong near-bin scores alone;
  • high PairLeakTopK or exact-pair overlap should be reported next to raw MT scores.

Installation

pip install tame-mt

Check that the package and native backend are available:

tame-mt doctor

Published wheels include the Rust backend. If doctor reports Native backend: unavailable, the install is incomplete and the default auto mode will refuse to score until the native extension is installed.

For local development from a checkout:

pip install -e '.[dev]'

If an editable install was created before the Rust extension was built, rebuild it with:

python -m pip install --force-reinstall --no-deps -e .

Quick Start

TAME-MT expects aligned UTF-8 text files, one segment per line:

train.src     source side of the training corpus
train.tgt     target side of the training corpus
test.src      source side of the test set
test.ref      reference translation for the test set
system.out    system hypothesis translations

Run a full train-aware score:

tame-mt score \
  --train-src train.src \
  --train-tgt train.tgt \
  --test-src test.src \
  --ref test.ref \
  --hyp system.out

Run the bundled toy example:

tame-mt score \
  --train-src examples/toy/train.src \
  --train-tgt examples/toy/train.tgt \
  --test-src examples/toy/test.src \
  --ref examples/toy/test.ref \
  --hyp examples/toy/hyp.out

The toy report includes the main pieces:

Quality
-------
Metric       System      TM baseline      delta over TM
BLEU           85.02            59.00            +26.01
chrF           85.45            61.73            +23.72

Exposure
--------
Source exposure:
  mean:             0.484
  exact overlap:    25.00%
  >= 0.85:         25.00%

Pair exposure:
  exact overlap:    25.00%
  PairLeakTopK@0.85:   25.00%

Generalization gap
------------------
GenGap-BLEU:  53.09
GenGap-chrF:  42.53

Write machine-readable artifacts:

tame-mt score \
  --train-src train.src \
  --train-tgt train.tgt \
  --test-src test.src \
  --ref test.ref \
  --hyp system.out \
  --json-out report.json \
  --diagnostic-out segments.diagnostic.jsonl \
  --cache-out segments.tamecache \
  --tm-out tm.out

The JSON report is for dashboards and reproducible experiment records. The diagnostic JSONL file is for per-example analysis. The .tamecache artifact contains the TM hypotheses needed by score-cached.

Large Corpora

Nearest-neighbor retrieval over the training corpus is the expensive part. For large corpora, build a reusable training index once:

tame-mt index build \
  --train-src train.src \
  --train-tgt train.tgt \
  --out train.tameidx

Then score or audit without passing the training files again:

tame-mt score \
  --index train.tameidx \
  --test-src test.src \
  --ref test.ref \
  --hyp system_a.out \
  --json-out system_a.tame.json

Inspect an index bundle without loading the full native indexes:

tame-mt index inspect train.tameidx

Important: .tameidx bundles contain enough training text to reproduce translation-memory outputs and neighbor diagnostics. Treat them like the original training corpus.

Many Systems

When the training corpus, test source, and references are fixed, cache the train-aware diagnostics once:

tame-mt audit \
  --index train.tameidx \
  --test-src test.src \
  --ref test.ref \
  --cache-out segments.tamecache \
  --json-out audit.json

Then score one hypothesis without another training-corpus pass:

tame-mt score-cached \
  --cache-in segments.tamecache \
  --ref test.ref \
  --hyp system_a.out \
  --json-out system_a.tame.json

Or score many systems in one batch:

tame-mt score-cached-batch \
  --cache-in segments.tamecache \
  --ref test.ref \
  --system baseline=baseline.out \
  --system model_a=model_a.out \
  --system model_b=model_b.out \
  --json-out-dir tame_reports

This is the closest TAME-MT path to ordinary BLEU/chrF runtime. The expensive exposure pass has already happened.

How To Read The Results

Pattern Interpretation
High BLEU, high TM-BLEU, high PairLeakTopK, low Far-BLEU Raw corpus score may overstate broad generalization. Report this as high-exposure or narrow-domain performance.
Moderate BLEU, low TM-BLEU, high delta over TM, good Far-BLEU Stronger evidence that the system is doing more than nearest-neighbor reuse.
Low BLEU, low TM-BLEU, low Far-BLEU The test set is not easy for the TM baseline, and the system is also weak.
High BLEU, low TM-BLEU, high Far-BLEU, low PairLeakTopK Stronger evidence of generalization under this test distribution.
High exposure and no far-bin data Valid in-domain result, but weak evidence for broad out-of-domain generalization.

Use these diagnostics as context, not as automatic pass/fail rules. A high-exposure benchmark can still be useful if the claim is in-domain performance. It is a problem when high-exposure scores are presented as broad generalization evidence.

How It Works

TAME-MT builds a simple translation-memory baseline from the training corpus:

  1. Normalize all strings for exposure scoring.
  2. Represent each string as a set of character n-grams.
  3. For each test source, find the most similar training source.
  4. Reuse that training source's paired target translation as the TM hypothesis.
  5. Score the system output and the TM hypotheses with BLEU and chrF.
  6. Compute exposure summaries and source-distance bins.

The default similarity is tokenizer-free character n-gram Jaccard similarity. That keeps the method deterministic and usable for languages without reliable tokenizers, segmenters, pretrained encoders, or external downloads.

By default TAME-MT normalizes only:

text = unicodedata.normalize("NFKC", text)
text = text.strip()
text = re.sub(r"\s+", " ", text)

It does not lowercase, strip diacritics, strip punctuation, or normalize digits unless you ask for those options.

The Math

This section uses simple GitHub-supported Markdown math and avoids custom operator macros.

Assume a training corpus with m aligned pairs:

(u_1, v_1), (u_2, v_2), ..., (u_m, v_m)

and a test set with n examples:

(x_1, r_1), (x_2, r_2), ..., (x_n, r_n)

Here:

  • u_j is a normalized training source;
  • v_j is the paired normalized training target;
  • x_i is a normalized test source;
  • r_i is a normalized reference translation;
  • h_i is a system hypothesis;
  • h_i^TM is the translation-memory hypothesis.

Character N-Gram Sets

For a normalized string s, let G_k(s) be the set of character n-grams of length k.

$$ G(s) = G_3(s) \cup G_4(s) \cup G_5(s) $$

String Similarity

Similarity is Jaccard similarity over the character n-gram sets:

$$ \mathrm{sim}(a,b) = \frac{|G(a) \cap G(b)|}{|G(a) \cup G(b)|} $$

If both strings are empty, similarity is defined as 1.0. If only one string is empty, similarity is 0.0.

Source Exposure

For each test source, source exposure is the similarity to the nearest training source:

$$ E_i^{src} = \max_{1 \le j \le m} \mathrm{sim}(x_i,u_j) $$

The nearest training source index is:

$$ n_i^{src} = \min {j : \mathrm{sim}(x_i,u_j) = E_i^{src}} $$

Ties are broken by choosing the lowest training index.

Target Exposure

For each reference translation, target exposure is the similarity to the nearest training target:

$$ E_i^{tgt} = \max_{1 \le j \le m} \mathrm{sim}(r_i,v_j) $$

Pair Exposure

Pair exposure asks a stricter question: is there one training pair whose source and target sides are both close to the test source/reference pair?

For test pair i and training pair j:

$$ P_{ij} = \min(\mathrm{sim}(x_i,u_j), \mathrm{sim}(r_i,v_j)) $$

The pair exposure for test example i is:

$$ E_i^{pair} = \max_{1 \le j \le m} P_{ij} $$

For threshold t, pair leak is:

$$ \mathrm{PairLeakTopK}{t} = \frac{1}{n}\sum{i=1}^{n}\mathbf{1}[E_i^{pair} \ge t] $$

For example, PairLeakTopK@0.85 = 0.20 means 20% of test examples have a source/reference pair that is very close to one training pair within the top-k candidate set. Exact pair overlap is exact; top-k pair leak is labeled separately because it is candidate-set limited.

When --exact-pair-thresholds is enabled, TAME-MT also reports PairLeakExact@t. That value checks whether any same-index training pair has both source similarity and target similarity at least t. It has no false negatives for the configured threshold, but it can be much slower than top-k pair reranking on large corpora.

Translation-Memory Baseline

The TM hypothesis for test source x_i is selected using only the source side:

$$ h_i^{TM} = v_{n_i^{src}} $$

If no useful candidate shares character n-grams with the test source, the default TM hypothesis is an empty string.

TAME-MT never uses the reference translation to choose the TM hypothesis. References are used only for scoring and diagnostics.

Delta Over TM

The system and TM baseline are scored with the same corpus metric:

$$ B_{sys} = \mathrm{BLEU}(h,r) $$

$$ B_{TM} = \mathrm{BLEU}(h^{TM},r) $$

The BLEU improvement over the training-memory baseline is:

$$ \Delta B = B_{sys} - B_{TM} $$

The same definition is used for chrF.

Distance Bins

TAME-MT bins test examples by source exposure:

Bin Definition
source_exact Normalized test source appears exactly in normalized train.src.
near Not exact, and SourceExposure >= 0.70.
medium 0.30 <= SourceExposure < 0.70.
far SourceExposure < 0.30.

Generalization gap is near-bin quality minus far-bin quality:

$$ Gap_{BLEU} = B_{near} - B_{far} $$

A large positive gap means the system performs much better on train-similar examples than on train-distant examples. A small gap is not automatically good: a weak system can score poorly in every bin.

Command Line Reference

Main commands:

Command Use
tame-mt doctor Show package, Python, dependency, and native backend status.
tame-mt score Run full train-aware scoring for one hypothesis.
tame-mt audit Compute exposure diagnostics without a system hypothesis.
tame-mt tm-baseline Write nearest-neighbor TM hypotheses.
tame-mt index build Build a reusable .tameidx training index.
tame-mt index inspect Inspect a .tameidx bundle manifest.
tame-mt index verify Verify bundle hashes, archive shape, and native-index invariants.
tame-mt score-cached Score one hypothesis from cached segment diagnostics.
tame-mt score-cached-batch Score many hypotheses from one cached segment file.

Common options:

--metrics bleu chrf
--ngram-orders 3,4,5
--far-threshold 0.30
--near-threshold 0.70
--leak-thresholds 0.70,0.85,0.95
--pair-k 50
--index-mode auto
--lowercase
--strip-diacritics
--normalize-punctuation
--bleu-tokenize 13a
--bleu-lowercase
--chrf-word-order 2
--verbose

Raw text is excluded from segment reports by default. These flags write raw text and should be used only when the data can safely be stored:

--include-source-text
--include-reference-text
--include-hyp-text
--include-neighbor-text

--include-neighbor-text may write raw training text.

Plain UTF-8 files and .gz files are supported for corpus inputs and for text, JSONL, and JSON outputs.

For exhaustive CLI details, see docs/cli.md.

Python API

Score files:

from tame_mt import ScoreConfig, TameScorer

scorer = TameScorer(ScoreConfig())

report = scorer.score_files(
    train_src="train.src",
    train_tgt="train.tgt",
    test_src="test.src",
    refs=["test.ref"],
    hyp="system.out",
)

print(report.system_scores["bleu"])
print(report.tm_scores["bleu"])
print(report.delta_scores["bleu"])
print(report.signature)

Score in-memory corpora:

from tame_mt import TameScorer

scorer = TameScorer()

report = scorer.score_corpus(
    train_src=train_src_lines,
    train_tgt=train_tgt_lines,
    test_src=test_src_lines,
    refs=[ref_lines],
    hyp=hyp_lines,
)

Get segment diagnostics and TM outputs:

result = scorer.evaluate_corpus(
    train_src=train_src_lines,
    train_tgt=train_tgt_lines,
    test_src=test_src_lines,
    refs=[ref_lines],
    hyp=hyp_lines,
)

report = result.report
segments = result.exposures
tm_hypotheses = result.tm_hyp

Reuse a saved training index:

from tame_mt import load_index_bundle, save_index_bundle

save_index_bundle("train.tameidx", train_src_lines, train_tgt_lines, scorer.config)

bundle = load_index_bundle("train.tameidx", scorer.config)
result = scorer.evaluate_index_bundle(
    bundle=bundle,
    test_src=test_src_lines,
    refs=[ref_lines],
    hyp=hyp_lines,
)

Prepare cached diagnostics once and score many systems:

from tame_mt import load_cached_artifact

artifact = load_cached_artifact(
    "segments.tamecache",
    refs=[ref_lines],
    config=scorer.config,
)
cached = scorer.prepare_from_cached_artifact(
    artifact,
    refs=[ref_lines],
)

reports = cached.score_many(
    {
        "baseline": baseline_lines,
        "model_a": model_a_lines,
        "model_b": model_b_lines,
    }
)

For deeper API documentation, see docs/api.md.

Outputs And Reproducibility

--json-out writes a stable report structure:

{
  "schema_version": "1.0",
  "tame_version": "0.2.0",
  "signature": "tame-mt|v:0.2.0|...",
  "data": {
    "num_train": 125000,
    "num_test": 1000,
    "num_refs": 1
  },
  "retrieval": {
    "mode": "exact",
    "source_exposure_mode": "exact",
    "target_exposure_mode": "exact",
    "pair_exposure_mode": "topk_rerank",
    "tm_retrieval_exact": true
  },
  "backend": {
    "name": "native_exact",
    "native": true,
    "exact": true,
    "requested_mode": "auto",
    "resolved_mode": "native_exact",
    "index_reused": false
  },
  "quality": {
    "system": {"bleu": 31.4, "chrf": 54.2},
    "tm": {"bleu": 23.8, "chrf": 47.1},
    "delta_tm": {"bleu": 7.6, "chrf": 7.1}
  },
  "exposure": {
    "source": {"mean": 0.71, "exact_overlap": 0.042},
    "target": {"mean": 0.684, "exact_overlap": 0.038},
    "pair": {"exact_overlap": 0.031}
  },
  "bins": [],
  "generalization_gap": {"bleu": 20.7, "chrf": 19.3},
  "warnings": []
}

Every report includes a deterministic signature that records:

  • TAME-MT version;
  • normalization settings;
  • similarity function;
  • retrieval mode, approximation flag, backend, and index mode;
  • TM baseline policy;
  • bin and leak thresholds;
  • pair reranking top-k and whether exact pair thresholds were computed;
  • BLEU/chrF settings;
  • metric-affecting dependency versions.

Example:

tame-mt|v:0.2.0|norm:nfkc_ws_case|sim:char_jaccard_3-5_set|retrieval:exact|approx:0|idx:auto|backend:native_exact|tm:src_nn_top1_zero_empty|bins:far0.30_near0.70_leak0.70,0.85,0.95|pair_k:50|pair_exact:0|fast:8,500,3000,1000|metrics:bleu,chrf|sacrebleu:bleu_tok_13a_lc_0_chrf_wo_2|deps:sacrebleu_2.6.0

For the JSON schema, see docs/json_schema.md.

Package Architecture

TAME-MT is split into small, testable modules:

src/tame_mt/
  cli.py          command-line interface
  api.py          public Python scoring API
  config.py       typed configuration and validation
  schema.py       report and segment dataclasses
  normalize.py    deterministic text normalization
  ngrams.py       character n-gram extraction
  similarity.py   Jaccard similarity logic
  index/          retrieval interfaces, native wrapper, and exact reference index
  native.py       native backend selection/status
  exact.py        exact overlap and exact-match helpers
  exposure.py     source, target, and pair exposure assembly
  approx_validation.py per-run fast-mode validation against exact retrieval
  tm.py           source-nearest-neighbor TM baseline
  bins.py         source-distance bins and gap metrics
  scoring.py      BLEU/chrF corpus and bin scoring
  metrics/        SacreBLEU integration
  artifacts.py    cached segment JSONL validation
  persistence.py  .tameidx bundle save/load/inspection
  performance.py  timing, thread, and memory metadata
  report.py       text, JSON, and JSONL report rendering
  io.py           UTF-8 and gzip input/output helpers

The retrieval package is intentionally split:

src/tame_mt/index/
  __init__.py     stable import surface for retrieval types
  base.py         retrieval protocols and result/backend dataclasses
  modes.py        backend mode and threshold validation helpers
  native.py       Rust-backed production index wrapper
  python_exact.py exact Python reference index for parity/debugging
  factory.py      construction helper for internal callers

The Rust/PyO3 native extension is the production retrieval engine. Python owns packaging, the public API, CLI argument parsing, file IO, normalization, SacreBLEU integration, aggregation, and report rendering. The internal tame_mt.index package separates retrieval protocols, mode resolution, the native wrapper, and a small Python exact reference index used for parity tests and debugging. Rust owns high-throughput nearest-neighbor search, exact reranking, pair reranking, and serialized native indexes. If the Rust extension is unavailable, normal scoring fails with an installation error instead of falling back silently.

Rust crate layout:

src/lib.rs              PyO3 module registration
src/index/mod.rs        native index construction and Python-exposed methods
src/index/query.rs      top-k query orchestration and exact/fast dispatch
src/index/exact.rs      exact nearest-neighbor ranking with reusable workspaces
src/index/fast.rs       approximate rare-gram candidate collection and rerank
src/index/pair.rs       pair-candidate reranking
src/index/validation.rs serialized-index invariant checks
src/index/workspace.rs  reusable per-query native work buffers
src/index/tests.rs      Rust native-index tests
src/ngrams.rs           UTF-8-safe character n-gram slicing
src/similarity.rs       integer Jaccard helpers
src/validation.rs       shared validation helpers
src/types.rs            compact native type aliases

Supporting directories:

tests/        Python unit and CLI tests
benchmarks/   synthetic performance and recall checks
examples/     toy data and public-corpus demo scripts/results
docs/         CLI, API, method, privacy, reproducibility, release, and demo docs
schemas/      JSON Schema contracts for reports and artifacts
.github/      CI, wheel, release, and Dependabot workflows

Performance

TAME-MT does more work than BLEU because it compares test examples to the training corpus. The package is designed so that cost is paid once whenever possible.

Retrieval modes:

Mode Behavior Use
auto Default. Requires Rust and resolves to exact native retrieval. Production scoring and audits.
native_exact Rust exact character n-gram Jaccard retrieval over shared-gram candidates. Small and medium corpora when exact nearest-neighbor exposure is required.
native_fast Rust rare-gram candidate generation plus exact reranking of a bounded shortlist. Explicit approximate exploratory runs with --retrieval approx --allow-approximate.

There are no Python retrieval backends. The small Python ngrams.py and similarity.py modules define the public metric math for tests and examples; they are not indexing engines.

Fast mode can be validated per corpus by sampling exact retrieval:

tame-mt audit \
  --train-src train.src \
  --train-tgt train.tgt \
  --test-src test.src \
  --ref test.ref \
  --retrieval approx \
  --allow-approximate \
  --validate-approx-sample 1000 \
  --json-out audit.json

The report then includes approx_validation, which compares approximate and exact retrieval for nearest-neighbor agreement, source-bin decisions, source-score error, pair-threshold decisions, and sample TM-BLEU. Validation is a guardrail for fast exploratory runs; exact mode remains the canonical mode for published numbers.

Recommended production workflow:

  1. Build train.tameidx once for a fixed training corpus.
  2. Run audit --index train.tameidx --cache-out segments.tamecache once for a fixed test/reference setup.
  3. Run score-cached-batch for all systems.

Local benchmark notes for public corpora and synthetic corpora are in docs/performance.md and examples/public_corpora_demo/.

Every JSON report includes a performance block with backend, thread count, index-reuse status, peak RSS, and available stage timings. Use --profile-json profile.json on CLI runs to write a separate command profile that includes final output-writing time.

Native retrieval uses Rayon. Pass --threads N to fix the worker count for a CLI run; --threads auto keeps Rayon defaults. Report JSON records the actual thread count in performance.threads.

Privacy And Security

TAME-MT runs locally. It does not download models, call remote services, or send text anywhere.

Data can still leak through artifacts you choose to write:

  • --include-neighbor-text can write raw training text;
  • .tameidx bundles contain training text needed for reproducible TM outputs;
  • .tamecache files contain TM baseline hypotheses and may therefore contain raw training-target text;
  • diagnostic/cache JSONL files may contain raw test/reference/hypothesis text if raw text flags are enabled.

Use --diagnostic-out for privacy-safer diagnostics that omit TM hypotheses by default. Use --include-tm-text only when that diagnostic artifact may safely store TM hypotheses. Cached scoring uses --cache-out, which intentionally includes TM hypotheses because they are required to recompute TM-BLEU and delta over TM.

Treat .tameidx, .tamecache, diagnostic JSONL, and metadata files from unknown sources as untrusted. The loader rejects malformed or suspicious index bundles before native deserialization, including unexpected ZIP members, duplicate names, unsafe declared sizes, excessive compression ratios, load-memory budget violations, unsupported schema versions, and invalid native-index invariants.

For more detail, see SECURITY.md.

Limitations

TAME-MT does not prove that a neural model memorized a sentence. It does not measure semantic adequacy. It does not decide whether a benchmark is valid. It does not replace human evaluation.

The default similarity is surface-based. It can miss semantic paraphrases and can overemphasize orthographic similarity.

Fast retrieval mode is approximate for nearest-neighbor retrieval, although shortlisted candidates are reranked with the exact Jaccard formula and exact normalized source, target, and pair overlaps remain exact.

Pair exposure in v0.1 reranks a candidate set for speed instead of scoring every possible training pair. Exact pair overlap is still exact.

Development And Contributing

Install development dependencies:

pip install -e '.[dev]'

Run the core checks:

pytest
ruff format --check .
ruff check .
mypy src/tame_mt
cargo fmt --check
cargo clippy --locked --all-targets -- -D warnings
cargo test --locked
python benchmarks/validate_fast_recall.py --require-native
python -m build
python -m twine check dist/*

Run the full release-candidate acceptance suite:

scripts/acceptance.sh

Contribution rules:

  • keep runtime dependencies small;
  • do not add model downloads or remote calls;
  • do not change metric definitions without updating signatures, tests, and the changelog;
  • do not print raw training-neighbor text by default;
  • add tests for user-visible CLI, JSON, artifact, or metric changes.

See CONTRIBUTING.md.

Release Process

Releases are built by GitHub Actions and published through PyPI Trusted Publishing.

Before a release:

  1. Update versions in pyproject.toml, Cargo.toml, and src/tame_mt/version.py, plus CITATION.cff and versioned README/schema examples.
  2. Update CHANGELOG.md.
  3. Run python scripts/check_versions.py.
  4. Run scripts/acceptance.sh.
  5. Push a v* tag.
  6. Let the tag-triggered release workflow build wheels, validate distributions, and generate the SBOM artifact.
  7. Manually dispatch the release workflow from the tag with publish=true.
  8. Approve the protected pypi environment deployment.

See docs/release.md.

Citation

@software{tame_mt_2026,
  title = {TAME-MT: Training-Aware Machine Translation Evaluation},
  year = {2026},
  version = {0.2.0},
  url = {https://github.com/hunterschep/TAME-MT}
}

License

TAME-MT is released under the MIT License. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tame_mt-0.2.0.tar.gz (169.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tame_mt-0.2.0-cp313-cp313-win_amd64.whl (400.4 kB view details)

Uploaded CPython 3.13Windows x86-64

tame_mt-0.2.0-cp313-cp313-win32.whl (406.7 kB view details)

Uploaded CPython 3.13Windows x86

tame_mt-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl (572.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

tame_mt-0.2.0-cp313-cp313-macosx_11_0_arm64.whl (500.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

tame_mt-0.2.0-cp312-cp312-win_amd64.whl (400.9 kB view details)

Uploaded CPython 3.12Windows x86-64

tame_mt-0.2.0-cp312-cp312-win32.whl (406.7 kB view details)

Uploaded CPython 3.12Windows x86

tame_mt-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl (572.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

tame_mt-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (500.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

tame_mt-0.2.0-cp311-cp311-win_amd64.whl (404.3 kB view details)

Uploaded CPython 3.11Windows x86-64

tame_mt-0.2.0-cp311-cp311-win32.whl (410.6 kB view details)

Uploaded CPython 3.11Windows x86

tame_mt-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl (575.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

tame_mt-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (506.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

tame_mt-0.2.0-cp310-cp310-win_amd64.whl (404.4 kB view details)

Uploaded CPython 3.10Windows x86-64

tame_mt-0.2.0-cp310-cp310-win32.whl (410.8 kB view details)

Uploaded CPython 3.10Windows x86

tame_mt-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl (576.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

tame_mt-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (506.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file tame_mt-0.2.0.tar.gz.

File metadata

  • Download URL: tame_mt-0.2.0.tar.gz
  • Upload date:
  • Size: 169.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b4a89c1ec58735a23cf188c71e7be94dbf01848361ac14bb42f40a8edaf9b628
MD5 22ac3fd067bb9725c773e1f2ef33147b
BLAKE2b-256 867c07e0783429b685a8a154d9710894f7ca2c554cc12fe1be880a5fd0adc7f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0.tar.gz:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 400.4 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 757135d8dab1fb0a565fcd82684183e1694eaf81a490acb1590284db7498b64d
MD5 54c15974016b13d952f04c720e187ced
BLAKE2b-256 40f3b34879ca1b293791fd716927253b8226699ebf2359173d44c1921f2c1dc2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp313-cp313-win32.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 406.7 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 3df32c3c3c9893bbf3100769a18fa34eadf4e838745ba7632eccbb1c634afc16
MD5 8acefb407ce2920d1a57456e4660986d
BLAKE2b-256 6da951130d67e9c807d7e46b4f8b360dfafb82143604dd9d08fd9d2139eaee79

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp313-cp313-win32.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d71173b636a5afe7e311f6ee978607f13402fd68ac34b307359821aa328dc228
MD5 16978245ca93cbbeb7195775be0115da
BLAKE2b-256 c9e151b0077e9b899795f96e0fa41585fb6b53d14cd1ef364114b5ac5a951870

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 19b4e23acfd34db321581dd79630ebc95800a9a798d4ad2ebc13da81331181d5
MD5 c6a4cf1eb12bbdd9437b9f49ccc95edc
BLAKE2b-256 eede5744bf23e36c1246c2cb0a12fa9f57b46bde45f9ea18a8cd21d64f77a9be

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 400.9 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 35b85fcfba8ff372a4178be29605863362cacbe1ca79220d19cbcd81378c2f6e
MD5 819f53b26d5a4b5e4c681bda946950fc
BLAKE2b-256 5dd799f212da86527ddb3cd4f7fce5eba7dea56be27f347ee8a63f364964a865

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp312-cp312-win32.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 406.7 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 7da19856dc2371a72a6886238a31300a386a2fe221d91b9ace765901097f7915
MD5 a0a5fd88fb5b34fe59736f2f9ac39141
BLAKE2b-256 ed1c5e2599b7ec0d5e5d1454d273efdbec0dca3a0bda4759ad18201033b24fe9

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp312-cp312-win32.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 92c657b6bc17946e17a6070f58dde0138b3f8b749553c93211088e151f92127d
MD5 32285b764e832beaac362fee15542062
BLAKE2b-256 b2e1a9549ec22b42558a53b02571078ed8500c1985a770455f5bd09f32366761

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 00535d2722b62b7fffcbefe08577cc70a231a81516033444e49f70550f864312
MD5 050e351822357c3c135248721df02995
BLAKE2b-256 9ae8eca355002b09fc21f27aa90a8625e9a388601609cb068b3241af42ea2911

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 404.3 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 bdb19250839cdfed7160373812013e16c3300b2bc94610121c77fca1711f35d3
MD5 e16e78dada5052a9cf3192194e31e50c
BLAKE2b-256 31a906de5226b8ef2e283836c00e7ad41a4b9990d679275e5f5edf7eaa4b55e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp311-cp311-win_amd64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp311-cp311-win32.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 410.6 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 27529dc2a354878a3b3b61aeb1e66da889f1220d20a9dcccb9af0ccf74abe17b
MD5 670c7ebfca0b0661f6143ebd1d67d627
BLAKE2b-256 49b90a12ca7199d5339786b9e450ee93f1badeecaa038a22d992e77bc28aa4e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp311-cp311-win32.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 06a7f4ee5c5b67a51ebdca04f5fa0a13e0315bf8f039162589baf499b3c8a099
MD5 abd711fb4cf9e77c7c698e8bc6147b8c
BLAKE2b-256 8c38f0aadb933910b915f8856e5929f06b5f219627b020f768c54d54d414bd0c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d857ff004238fa1bff63afc4a23ef9a0a037da59caef8171b44110e89cc17300
MD5 b2252ff3ba20029f07c6f23921dfd3b1
BLAKE2b-256 21278b45d1a1b19850c754cbd633fffa8cb10ba6d5829150f80b9b834914c3cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 404.4 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f263952f5904ef9ee3ded95a152bb1fdaedf7b36b0bbf9633a738182f0a6b50c
MD5 550c2cba771a6172fb10f1c8ed68c44c
BLAKE2b-256 85a72c2926b015baf61242704e143a46b570c46969fa1419e0b0843658ffb8ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp310-cp310-win_amd64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp310-cp310-win32.whl.

File metadata

  • Download URL: tame_mt-0.2.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 410.8 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for tame_mt-0.2.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 8a5b9d23c2a3bb755af8cd67f68fae5dfd58f48dd5fe7ece4648f4d54e29f622
MD5 b3d76dc5f03312931278992092891caa
BLAKE2b-256 a440c293e1b741b6d9f741c52743613008864289ba24d5b6bea99f3a257f04b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp310-cp310-win32.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 87bbb3847df6bfc95e141c7ed1b624e96572c192ea8aee01c7243a2a74606195
MD5 d9f6349d0a8abc3fb39cce4c1d230250
BLAKE2b-256 ebd1b37e9f0cd701d5caae15641a4294416634e1b26c4f00f65aad8735afdcf2

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp310-cp310-manylinux_2_28_x86_64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tame_mt-0.2.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tame_mt-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 13ad22ac1f654a4862e71461e0f744ee62fb6e2d1da4fa4cc83eac3921b691ba
MD5 3e48d8df236c16f824b49928475fdc44
BLAKE2b-256 fdf11f4773237ec4250aaf592a14295a2deb6401ec6a93210920ba0d68aa86ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for tame_mt-0.2.0-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: release.yml on hunterschep/TAME-MT

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page