import type { SimilarityScore } from "../types/index.js"; /** * Computes Jaccard similarity between token sets * * @param s1 - First string * @param s2 - Second string * @returns Jaccard index in [0, 1] * * @pure true * @purity CORE * @effect None * @invariant ∀s: jaccard(s, s) = 1 (reflexivity) * @invariant ∀s1,s2: jaccard(s1, s2) = jaccard(s2, s1) (symmetry) * @invariant ∀s1,s2: 0 ≤ jaccard(s1, s2) ≤ 1 (bounded) * @complexity O(n + m) where n = |tokens1|, m = |tokens2| * @throws Never * * FORMAT THEOREM: jaccard(A, B) = |A ∩ B| / |A ∪ B| */ export declare function jaccardSimilarity(s1: string, s2: string): SimilarityScore; /** * Computes containment score (how well one string contains another) * * @param s1 - First string * @param s2 - Second string * @returns Containment score in [0, 1] * * @pure true * @purity CORE * @effect None * @invariant containment(s, s) ≥ 0.8 (high self-containment) * @invariant 0 ≤ containment(s1, s2) ≤ 1 (bounded) * @complexity O(n) where n = max(|s1|, |s2|) * @throws Never */ export declare function containmentScore(s1: string, s2: string): SimilarityScore; /** * Computes prefix bonus for common prefixes * * @param s1 - First string * @param s2 - Second string * @returns Prefix score in [0, 1] * * @pure true * @purity CORE * @effect None * @invariant prefixScore(s, s) = 1 (reflexivity) * @invariant 0 ≤ prefixScore(s1, s2) ≤ 1 (bounded) * @complexity O(min(|s1|, |s2|)) * @throws Never * * FORMAT THEOREM: prefixScore = min(4, commonPrefix) / 4 */ export declare function prefixScore(s1: string, s2: string): SimilarityScore; /** * Computes length penalty for significantly different lengths * * @param userInput - User's typed string * @param candidate - Candidate suggestion * @returns Penalty in [0, 0.15] * * @pure true * @purity CORE * @effect None * @invariant penalty(s, s) = 0 (no self-penalty) * @invariant ∀s,c: |c| >> |s| → penalty ↑ (increases with length diff) * @invariant 0 ≤ penalty ≤ 0.15 (bounded) * @complexity O(1) * @throws Never * * FORMAT THEOREM: penalty = min(0.15, max(0, |candidate| - |userInput|) · 0.01) */ export declare function lengthPenalty(userInput: string, candidate: string): number; /** * Computes composite similarity score combining multiple algorithms * * @param userInput - User's typed string * @param candidate - Candidate suggestion * @returns Composite score in [0, 1] * * @pure true * @purity CORE * @effect None * @invariant ∀s: compositeScore(s, s) > 0.85 (high self-similarity) * @invariant ∀s1,s2: 0 ≤ compositeScore(s1, s2) ≤ 1 (bounded) * @invariant ∀s,c: |c| >> |s| → compositeScore(s,c) ↓ (length penalty) * @complexity O(n·m) dominated by Jaro-Winkler * @throws Never * * FORMAT THEOREM: compositeScore = clamp( * 0.5·jw + 0.3·jaccard + 0.1·containment + 0.1·prefix - penalty, * 0, 1 * ) */ export declare function compositeScore(userInput: string, candidate: string): SimilarityScore; //# sourceMappingURL=composite.d.ts.map