private getClassifierResult()

in packages/core/src/codewhisperer/service/classifierTrigger.ts [499:577]


    private getClassifierResult(
        leftContext: string,
        rightContext: string,
        os: string,
        triggerType: string | undefined,
        char: string,
        lineNum: number,
        language: ProgrammingLanguage
    ): number {
        const leftContextLines = leftContext.split(/\r?\n/)
        const leftContextAtCurrentLine = leftContextLines[leftContextLines.length - 1]
        const tokens = leftContextAtCurrentLine.trim().split(' ')
        let keyword = ''
        const lastToken = tokens[tokens.length - 1]
        if (lastToken && lastToken.length > 1) {
            keyword = lastToken
        }
        const lengthOfLeftCurrent = leftContextLines[leftContextLines.length - 1].length
        const lengthOfLeftPrev = leftContextLines[leftContextLines.length - 2]?.length ?? 0
        const lengthOfRight = rightContext.trim().length

        const triggerTypeCoefficient: number = this.triggerTypeCoefficientMap[triggerType || ''] ?? 0
        const osCoefficient: number = this.osCoefficientMap[os] ?? 0
        const charCoefficient: number = this.charCoefficient[char] ?? 0
        const keyWordCoefficient: number = this.charCoefficient[keyword] ?? 0
        const ideCoefficient = this.ideVscode

        const previousDecision = TelemetryHelper.instance.getLastTriggerDecisionForClassifier()
        const languageCoefficients = Object.values(this.languageCoefficientMap)
        const avrgCoefficient =
            languageCoefficients.length > 0
                ? languageCoefficients.reduce((a, b) => a + b) / languageCoefficients.length
                : 0
        const languageCoefficient = this.languageCoefficientMap[language.languageName] ?? avrgCoefficient

        let previousDecisionCoefficient = 0
        if (previousDecision === 'Accept') {
            previousDecisionCoefficient = this.prevDecisionAcceptCoefficient
        } else if (previousDecision === 'Reject') {
            previousDecisionCoefficient = this.prevDecisionRejectCoefficient
        } else if (previousDecision === 'Discard' || previousDecision === 'Empty') {
            previousDecisionCoefficient = this.prevDecisionOtherCoefficient
        }

        let leftContextLengthCoefficient = 0
        if (leftContext.length >= 0 && leftContext.length < 5) {
            leftContextLengthCoefficient = this.lengthLeft0To5
        } else if (leftContext.length >= 5 && leftContext.length < 10) {
            leftContextLengthCoefficient = this.lengthLeft5To10
        } else if (leftContext.length >= 10 && leftContext.length < 20) {
            leftContextLengthCoefficient = this.lengthLeft10To20
        } else if (leftContext.length >= 20 && leftContext.length < 30) {
            leftContextLengthCoefficient = this.lengthLeft20To30
        } else if (leftContext.length >= 30 && leftContext.length < 40) {
            leftContextLengthCoefficient = this.lengthLeft30To40
        } else if (leftContext.length >= 40 && leftContext.length < 50) {
            leftContextLengthCoefficient = this.lengthLeft40To50
        }

        const result =
            (this.lengthOfRightCoefficient * (lengthOfRight - this.minn.lenRight)) /
                (this.maxx.lenRight - this.minn.lenRight) +
            (this.lengthOfLeftCurrentCoefficient * (lengthOfLeftCurrent - this.minn.lenLeftCur)) /
                (this.maxx.lenLeftCur - this.minn.lenLeftCur) +
            (this.lengthOfLeftPrevCoefficient * (lengthOfLeftPrev - this.minn.lenLeftPrev)) /
                (this.maxx.lenLeftPrev - this.minn.lenLeftPrev) +
            (this.lineNumCoefficient * (lineNum - this.minn.lineNum)) / (this.maxx.lineNum - this.minn.lineNum) +
            osCoefficient +
            triggerTypeCoefficient +
            charCoefficient +
            keyWordCoefficient +
            ideCoefficient +
            this.intercept +
            previousDecisionCoefficient +
            languageCoefficient +
            leftContextLengthCoefficient

        return sigmoid(result)
    }