PRININIT / lib /src /eval /evaluator.js
Rachit-Tw's picture
Upload 183 files
272a04f verified
Raw
History Blame Contribute Delete
6.83 kB
"use strict";
/**
* PRIX AI Evaluation System - Evaluation Engine
* Compares test outputs against expected results
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Evaluator = void 0;
exports.evaluate = evaluate;
class Evaluator {
options;
constructor(options = {}) {
this.options = {
strictConfidence: false,
strictIssueType: false,
allowPartialMatches: true,
...options
};
}
/**
* Evaluate a single test output against expected results
*/
evaluate(testCase, output) {
const startTime = Date.now();
const score = this.calculateScore(output, testCase.expected);
return {
testName: testCase.name,
testPath: testCase.path,
category: testCase.category,
passed: score.overall,
score,
output,
expected: testCase.expected,
executionTime: output.executionTime,
timestamp: new Date().toISOString()
};
}
/**
* Calculate detailed score for a test
*/
calculateScore(output, expected) {
// Detection check
const detectionMatch = expected.shouldDetectIssue === output.detectedIssues;
// Issue type check (if detection expected)
let typeMatch = true;
if (expected.shouldDetectIssue && expected.issueType && output.issueType) {
typeMatch = this.matchIssueType(expected.issueType, output.issueType);
}
// Confidence check
let confidenceMatch = true;
if (expected.expectedConfidence && output.confidence) {
confidenceMatch = this.matchConfidence(expected.expectedConfidence, output.confidence);
}
// Auto-PR check
const autoPRMatch = expected.shouldAutoPR === output.autoPRTriggered;
// Suggestion count check (if specific count expected)
let suggestionCountMatch = true;
if (expected.expectedSuggestions) {
suggestionCountMatch =
expected.expectedSuggestions.length === output.suggestions.length;
}
// Calculate overall score
const allChecks = [
detectionMatch,
typeMatch,
confidenceMatch,
autoPRMatch,
suggestionCountMatch
];
// Weight detection more heavily
const overall = detectionMatch &&
(typeMatch || !this.options.strictIssueType) &&
(confidenceMatch || !this.options.strictConfidence) &&
autoPRMatch;
return {
detection: detectionMatch,
classification: typeMatch,
confidence: confidenceMatch,
autoPR: autoPRMatch,
overall,
details: {
detectionMatch,
typeMatch,
confidenceMatch,
autoPRMatch,
suggestionCountMatch
}
};
}
/**
* Match issue types with flexibility
*/
matchIssueType(expected, actual) {
if (expected === actual)
return true;
if (!this.options.strictIssueType) {
// Allow some flexibility in classification
const securityTypes = ['security', 'bug'];
const bugTypes = ['bug', 'mutation'];
if (securityTypes.includes(expected) && securityTypes.includes(actual))
return true;
if (bugTypes.includes(expected) && bugTypes.includes(actual))
return true;
}
return false;
}
/**
* Match confidence levels
*/
matchConfidence(expected, actual) {
if (expected === actual)
return true;
if (!this.options.strictConfidence) {
// Allow adjacent confidence levels
const levels = ['low', 'medium', 'high'];
const expectedIdx = levels.indexOf(expected);
const actualIdx = levels.indexOf(actual);
// Within 1 level is acceptable
return Math.abs(expectedIdx - actualIdx) <= 1;
}
return false;
}
/**
* Generate detailed evaluation report for a single test
*/
generateReport(result) {
const lines = [
`\n${'='.repeat(60)}`,
`Test: ${result.testName} (${result.category})`,
`${'='.repeat(60)}`,
`Status: ${result.passed ? 'βœ… PASS' : '❌ FAIL'}`,
`Execution Time: ${result.executionTime}ms`,
'',
'--- Expected ---',
` Detect Issue: ${result.expected.shouldDetectIssue}`,
` Issue Type: ${result.expected.issueType || 'any'}`,
` Confidence: ${result.expected.expectedConfidence || 'any'}`,
` Auto-PR: ${result.expected.shouldAutoPR}`,
'',
'--- Actual ---',
` Detected: ${result.output.detectedIssues}`,
` Type: ${result.output.issueType || 'none'}`,
` Confidence: ${result.output.confidence || 'none'}`,
` Auto-PR: ${result.output.autoPRTriggered}`,
` Suggestions: ${result.output.suggestions.length}`,
` Comments: ${result.output.comments.length}`,
'',
'--- Score Breakdown ---',
` Detection: ${result.score.detection ? 'βœ…' : '❌'}`,
` Classification: ${result.score.classification ? 'βœ…' : '❌'}`,
` Confidence: ${result.score.confidence ? 'βœ…' : '❌'}`,
` Auto-PR: ${result.score.autoPR ? 'βœ…' : '❌'}`,
'',
'--- Errors ---',
...(result.output.errors.length > 0
? result.output.errors.map(e => ` ❌ ${e}`)
: [' None'])
];
return lines.join('\n');
}
/**
* Compare two test results for regression detection
*/
compareResults(baseline, current) {
const changes = [];
if (baseline.passed && !current.passed) {
changes.push(`Test ${current.testName} started failing`);
}
if (!baseline.passed && current.passed) {
changes.push(`Test ${current.testName} now passing (improvement)`);
}
if (baseline.score.overall && !current.score.overall) {
changes.push(`Overall score degraded for ${current.testName}`);
}
return {
regressed: changes.some(c => c.includes('failing') || c.includes('degraded')),
changes
};
}
}
exports.Evaluator = Evaluator;
/**
* Utility function for quick evaluation
*/
function evaluate(output, expected, options) {
const evaluator = new Evaluator(options);
return evaluator.calculateScore(output, expected);
}
//# sourceMappingURL=evaluator.js.map