From fef8319e6447d355ee27c2a455dbd4df1e071606 Mon Sep 17 00:00:00 2001 From: jahorton Date: Thu, 3 Sep 2020 13:16:12 +0700 Subject: [PATCH] fix(common/models): fixes first-char input distrib loss --- .../worker/correction/context-tracker.ts | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/common/predictive-text/worker/correction/context-tracker.ts b/common/predictive-text/worker/correction/context-tracker.ts index f574a85992..471dffe33d 100644 --- a/common/predictive-text/worker/correction/context-tracker.ts +++ b/common/predictive-text/worker/correction/context-tracker.ts @@ -8,7 +8,7 @@ namespace correction { export class TrackedContextToken { raw: string; - transformDistributions: Distribution[]; + transformDistributions: Distribution[] = []; replacements: TrackedContextSuggestion; activeReplacement: number = -1; } @@ -116,11 +116,14 @@ namespace correction { let poppedHead = false; let pushedTail = false; - // First entry: may not be an 'insert' or a 'transpose' op. - if(editPath[0] == 'insert' || editPath[0].indexOf('transpose') >= 0) { - return null; - } else if(editPath[0] == 'delete') { - poppedHead = true; // a token from the previous state has been wholly removed. + // Matters greatly when starting from a nil context. + if(editPath.length > 1) { + // First entry: may not be an 'insert' or a 'transpose' op. + if(editPath[0] == 'insert' || editPath[0].indexOf('transpose') >= 0) { + return null; + } else if(editPath[0] == 'delete') { + poppedHead = true; // a token from the previous state has been wholly removed. + } } // Last entry: may not be a 'delete' or a 'transpose' op. @@ -211,7 +214,12 @@ namespace correction { } else { // TODO: Assumption: we didn't 'miss' any inputs somehow. // As is, may be prone to fragility should the lm-layer's tracked context 'desync' from its host's. - let editedToken = newState.tokens[newState.tokens.length - 1]; + let editedToken: TrackedContextToken; + if(editPath[tailIndex] == 'insert') { + editedToken = new TrackedContextToken(); + } else { + editedToken = newState.tokens[newState.tokens.length - 1]; + } if(transformDistribution && transformDistribution.length > 0) { editedToken.transformDistributions.push(transformDistribution); if(newState.searchSpace) {