Push vqmnuyrkpxot #9
@@ -8,6 +8,9 @@ Ne modifier aucun fichier à moins d'une demande explicite de modification. En p
|
|||||||
**Règle absolue : ne jamais substituer une dépendance ou une bibliothèque sans validation explicite.**
|
**Règle absolue : ne jamais substituer une dépendance ou une bibliothèque sans validation explicite.**
|
||||||
Si une dépendance demandée pose problème (erreur de compilation, bug, API manquante), exposer le problème et proposer des alternatives — ne jamais switcher silencieusement vers une autre bibliothèque. Le choix des dépendances est une décision d'architecture qui appartient au développeur.
|
Si une dépendance demandée pose problème (erreur de compilation, bug, API manquante), exposer le problème et proposer des alternatives — ne jamais switcher silencieusement vers une autre bibliothèque. Le choix des dépendances est une décision d'architecture qui appartient au développeur.
|
||||||
|
|
||||||
|
**Règle absolue : le code existant est une hypothèse, pas une vérité.**
|
||||||
|
Quand une nouvelle construction (type, itérateur, abstraction) rend du code historique injustifié, le signaler immédiatement et proposer de le supprimer — ne pas conserver les deux en parallèle par inertie. Le développeur demande explicitement de remettre en cause le code base : ne pas attendre qu'il insiste.
|
||||||
|
|
||||||
Tu maintiens en **anglais**, dense et sans remplissage, les documents suivants :
|
Tu maintiens en **anglais**, dense et sans remplissage, les documents suivants :
|
||||||
- `docmd/index.md` — document de discussion de base, enrichi progressivement au fil de nos échanges ; il reflète l'état courant de la réflexion sur le projet
|
- `docmd/index.md` — document de discussion de base, enrichi progressivement au fil de nos échanges ; il reflète l'état courant de la réflexion sur le projet
|
||||||
- les autres fichiers Markdown dans `docmd/` selon leur thème respectif
|
- les autres fichiers Markdown dans `docmd/` selon leur thème respectif
|
||||||
|
|||||||
@@ -218,11 +218,15 @@ impl MphfLayer {
|
|||||||
|
|
||||||
match evidence_kind {
|
match evidence_kind {
|
||||||
// ── Exact path ────────────────────────────────────────────────────
|
// ── Exact path ────────────────────────────────────────────────────
|
||||||
|
// .idx is built LAST, once evidence.bin is written, so it is never
|
||||||
|
// present during construction — only at query time.
|
||||||
EvidenceKind::Exact => {
|
EvidenceKind::Exact => {
|
||||||
build_unitig_idx(&unitig_path, block_bits)?;
|
let n = UnitigFileReader::open_sequential(&unitig_path)?.n_kmers();
|
||||||
|
let keys = CanonicalKmerIter::new(&unitig_path)
|
||||||
let unitigs = UnitigFileReader::open(&unitig_path)?;
|
.map_err(|e| match e {
|
||||||
let n = unitigs.n_kmers();
|
obiskio::SKError::Io(io) => OLMError::Io(io),
|
||||||
|
e => OLMError::InvalidLayer(e.to_string()),
|
||||||
|
})?;
|
||||||
|
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
fs::File::create(dir.join(EVIDENCE_FILE))?;
|
fs::File::create(dir.join(EVIDENCE_FILE))?;
|
||||||
@@ -232,15 +236,13 @@ impl MphfLayer {
|
|||||||
mphf.store(&dir.join(MPHF_FILE))
|
mphf.store(&dir.join(MPHF_FILE))
|
||||||
.map_err(|e| OLMError::InvalidLayer(e.to_string()))?;
|
.map_err(|e| OLMError::InvalidLayer(e.to_string()))?;
|
||||||
LayerMeta::exact().save(dir)?;
|
LayerMeta::exact().save(dir)?;
|
||||||
|
build_unitig_idx(&unitig_path, block_bits)?;
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass 1 — parallel MPHF via random access (.idx required)
|
// Pass 1 — MPHF construction via clonable mmap iterator
|
||||||
let keys = (0..unitigs.len())
|
|
||||||
.into_par_iter()
|
|
||||||
.flat_map_iter(|ci| unitigs.unitig(ci).into_canonical_kmers().map(|km| km.raw()));
|
|
||||||
let mphf: Mphf =
|
let mphf: Mphf =
|
||||||
Mphf::new_from_par_iter(n, keys, PtrHashParams::<CubicEps>::default());
|
Mphf::new_from_par_iter(n, keys.map(|k| k.raw()).par_bridge(), PtrHashParams::<CubicEps>::default());
|
||||||
mphf.store(&dir.join(MPHF_FILE))
|
mphf.store(&dir.join(MPHF_FILE))
|
||||||
.map_err(|e| OLMError::InvalidLayer(e.to_string()))?;
|
.map_err(|e| OLMError::InvalidLayer(e.to_string()))?;
|
||||||
|
|
||||||
@@ -266,6 +268,8 @@ impl MphfLayer {
|
|||||||
|
|
||||||
ev.write(&dir.join(EVIDENCE_FILE))?;
|
ev.write(&dir.join(EVIDENCE_FILE))?;
|
||||||
LayerMeta::exact().save(dir)?;
|
LayerMeta::exact().save(dir)?;
|
||||||
|
// .idx built last: strictly for query-time kmer verification
|
||||||
|
build_unitig_idx(&unitig_path, block_bits)?;
|
||||||
Ok(n)
|
Ok(n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user