/** Seuil Memory Echo (prod) — connexions sous ce score ne sont pas proposées. */ export const SEMANTIC_SIMILARITY_FLOOR = 0.75 export const SEMANTIC_SIMILARITY_FLOOR_DEMO = 0.5 /** Seuil assoupli pour notes clippées / RTL (persan, arabe) — bruit HTML réduit la similarité. */ export const SEMANTIC_SIMILARITY_FLOOR_CLIP = 0.58 /** Ratio 0 (seuil) → 1 (identique), pour étaler l’affichage au-dessus du seuil. */ export function semanticProximityRatio( similarity: number, floor = SEMANTIC_SIMILARITY_FLOOR, ): number { const clamped = Math.max(floor, Math.min(1, similarity)) if (floor >= 1) return 1 return (clamped - floor) / (1 - floor) } /** Pourcentage « proximité » affiché (0–100), étalé entre le seuil et 100 %. */ export function semanticProximityPercent( similarity: number, floor = SEMANTIC_SIMILARITY_FLOOR, ): number { return Math.round(semanticProximityRatio(similarity, floor) * 100) } /** Rayon orbite : plus la proximité est forte, plus le nœud est proche du centre. */ export function semanticOrbitRadius( similarity: number, floor = SEMANTIC_SIMILARITY_FLOOR, ): number { const MIN_R = 34 const MAX_R = 94 const t = semanticProximityRatio(similarity, floor) return MAX_R - t * (MAX_R - MIN_R) }