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)
}