OnPair trainer should draw Rust's sample (StdRng + partial_shuffle) for byte-identical dictionaries
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 22/100
Piste de recherche
Start in OnPairEncodingEncoder.Encoder.train, which uses SplittableRandom(42) and a full Fisher-Yates shuffle, and compare it with the Rust training_order in encoding/trainer.rs. Port the partial_shuffle tail selection and doubling retry loop on top of SampleRng, and check that SampleRng.nextIntInclusive matches random_range from rand 0.9.5. Done when the 100k-row URL column gives the same dict_bytes_len and encoded size per chunk as the Rust 0.88.0 oracle.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Problem
OnPairEncodingEncoder does not draw the same training sample as the Rust onpair crate, so it trains different dictionaries on identical data. Prime directive: behavioral parity with Rust.
Found by comparing a 100k-row URL column (https://example.com/products/<n>/reviews?page=<m>, 7 chunks of 16,384 rows) written by vortex-java and by Rust 0.88.0 (the release vortex-jni uses), both at cascade 3 with global dict off. Both pick vortex.onpair per chunk.
dict_bytes_len per chunk:
| chunk | Rust | Java |
|---|---|---|
| 0 | 8191 | 8429 |
| 1 | 8525 | 8368 |
| 2 | 8447 | 8387 |
| 3 | 8363 | 8452 |
| 4 | 8379 | 8473 |
| 5 | 8757 | 5670 |
| 6 | 1872 | 1877 |
Chunks 0-4 end up within 0.04% in total, but Java's chunk 5 is 18% smaller (131,904 B vs 161,507 B): its trainer built a 761-token dictionary and the cascade then dict-encoded the 467 distinct codes. That one chunk is 29.6 KB of the 31.6 KB (3.2%) by which Java's file is smaller. This is training luck, not a systematic advantage, and it could go the other way on other data.
Cause
- Rust (
onpair0.2.1,training_orderinencoding/trainer.rs):StdRng::seed_from_u64(42)(ChaCha12,rand0.9.5) andorder.partial_shuffle(&mut rng, k)withk = min(n, 2 * sample_fraction * n + 1024). Training consumes only the selected tailorder[n-k..]; if that tail is shorter than the byte budget,kdoubles and the shuffle restarts. - Java (
OnPairEncodingEncoder.Encoder.train):SplittableRandom(42), a full Fisher-Yates shuffle, and training consumesorderfrom the start.
Proposed fix
- Port
rand0.9.5partial_shuffleon top ofSampleRng(already a bit-exact ChaCha12StdRngandrandom_rangeforu32). It usesIncreasingUniform/calculate_bound_u32, which batches several swaps into one random chunk. Check thatSampleRng.nextIntInclusive(written againstrand0.10) gives the same values as 0.9.5'srandom_range. - Reproduce the
kcomputation, the tail consumption and the doubling retry loop intrain. - Parity test: the URL column above, Rust as the oracle, comparing
dict_bytes_lenand encoded size per chunk (expect identical).
Repro
Scratch crate with vortex = "=0.88.0"; data dumped from the Java CascadeDepthGainIntegrationTest patterns (utf8-urls), seed 42. Not committed.
- Langage dominant
- Java
- Étoiles
- 3
- Forks
- 2
- Merge moyen
- 9 h 51 min
- PR mergées (30 j)
- 127
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de dfa1/vortex-java
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
dfa1/vortex-java#636 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
dfa1/vortex-java#657 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 3/5 1-2 jours Accessibilité débutants 70/100
dfa1/vortex-java#655 ·
Les mainteneurs répondent en général sous 1 jour
-
perf
Difficulté 4/5 3-5 jours Accessibilité débutants 30/100
dfa1/vortex-java#651 ·
Les mainteneurs répondent en général sous 1 jour
-
Writer: string columns written as per-chunk dicts where Rust uses its dict layout (up to 2x larger)Ouverteperf
Difficulté 4/5 3-5 jours Accessibilité débutants 30/100
dfa1/vortex-java#650 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de dfa1/vortex-java
Issues similaires
-
maintenance
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
apache/maven-resources-plugin#569 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
micronaut-projects/micronaut-redis#844 ·
Les mainteneurs répondent en général sous 4 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Suwayomi/Suwayomi-Server#2531 ·
Les mainteneurs répondent en général sous 6 jours
-
ai-driven-fuzzing bug claude Major
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
linagora/tmail-backend#2862 ·
Les mainteneurs répondent en général sous 1 jour
-
ai-driven-fuzzing bug claude Minor
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
linagora/twake-calendar-side-service#1435 ·
Les mainteneurs répondent en général sous 1 jour