What is a grade?
A grade is a value between 1.00 and 4.00 to assess a risk:
The rule grade is calculated for:
- each functional module
- each functional module split by technology
- application: in this case the application grade comes from the representative functional module which is:
- either the Full Content Module if it exists
- or the union content module
What does it mean when a grade equals to zero?
A rule with zero weight is a rule that is both enabled (active), but has no impact on any parent technical criterion - this means that the rule can be "previewed" (i.e. violations can be seen) without impacting any grades. Configuring a rule with a weight of 0 is supported when using AIP Core ≥ 8.3.32 - you can do this using the Assessment Model interface in AIP Console. A zero value for a technical criterion grade means that all child rules contribute to this grade with a zero weight. A zero grade is not an assessment value, it is a result allowing a navigation to the child rules and their violations in "preview" mode. So a zero grade means "no value" for this technical criterion.
Rules with a 0 weight or a 0 grade are never consolidated into the Measure schema, so will not appear in the Health Dashboard.
When a rule is disabled (inactive), no result is inserted into the Dashboard schema for this rule, so there is also no impact on the parent technical criterion.
Calculation of a rule grade
A rule grade is calculated from the compliance ratio as a point of the following curve:
Click to enlarge
The curve is defined as four linear segments, bounded with thresholds. The input parameters are:
- The thresholds: four decimal values. If not defined the default values are [ 10.0, 70.0, 90.0, 99.0 ].
- The number of failed checks (the number of violations)
- The total number of checks
The grade is calculated as follows:
// From AIP 8.3.29 function computeRuleGrade (nbFailedChecks, nbTotalChecks, thresholds) { // Descending thresholds are not taken into account here, as there are no longer used if (nbFailedChecks == 0 || nbTotalChecks == 0) return 4.0 ; // wrong rule if (nbTotalChecks <= nbFailedChecks) return 1.0; // wrong rule or nbFailedCheks == nbTotalChecks let violationRatio = nbFailedChecks / nbTotalChecks; let complianceRatio = (100.0 - violationRatio * 100.0); if (complianceRatio < thresholds[0]) return 1.0; if (complianceRatio < thresholds[1]) return 1.0 + (complianceRatio - thresholds[0]) / (thresholds[1] - thresholds[0]); if (complianceRatio < thresholds[2]) return 2.0 + (complianceRatio - thresholds[1]) / (thresholds[2] - thresholds[1]); if (complianceRatio < thresholds[3]) return 3.0 + (complianceRatio - thresholds[2]) / (thresholds[3] - thresholds[2]); return 4.0; }
Calculation of a Distribution grade
For each distribution, there are four categories:
- Very high
- High
- Moderate
- Low
Each object is distributed into a category. AIP counts the number of items in each category:
- count1
- count2
- count3
- count4
count_total = count1 + count2 + count3 + count4
AIP computes four grades for each category:
- grade1 = computeDistGrade(count1/count_total, thresholds of category 1)
- grade2 = computeDistGrade(count2/count_total, thresholds of category 2)
- grade3 = computeDistGrade(count3/count_total, thresholds of category 3)
- grade4 = computeDistGrade(count4/count_total, thresholds of category 4)
The distribution grade is MIN (grade1, grade2, grade3, grade4).
Calculation of a Technical Criterion grade
The grade of a technical criterion is calculated from all the rule contributors of the technical criterion:
These quality indicators are:
- Rules
- Distributions
- Measures
The input parameters are:
- An array of contributions; each contribution is defined with:
- a grade
- a contribution weigth
- a contribution critical flag
The grade is calculated as follow:
// From AIP 8.3.29 function computeCriterionGrade (contributions) { // Calculate weighted average of all contributions // Calculate the minimum critical contribution grade // Then return the Min let sum = 0.0; let totalWeights = 0.0; let minCriticalGrade = 4.0; for (let i = 0, len = contributions.length; i < len; i++) { let contribution = contributions[i]; let weight = contribution.weight; let grade = contribution.grade; if (weight == 0.0) continue; // do not take into account zero weight if (!grade) continue; // do not take into account null/zero grade (when all contributors have a zero weight) if (contribution.critical && grade < minCriticalGrade) minCriticalGrade = grade; sum += weight * grade; totalWeights += weight; } if (totalWeights == 0.0) return 0.0; // grade is 0.0 when all weights are zero let weightedAverage = (sum / totalWeights); return Math.min (minCriticalGrade, weightedAverage); }
Calculation of a Business Criterion grade
The grade of a business criterion is calculated from all the Technical Criteria contributors of the business criterion:
The input parameters are:
- An array of contributions; each contribution is defined with
- a grade
- a contribution weight
- a contribution critical flag
The grade is calculated also with the "computeCriterionGrade" algorithm, except that there is no critical contribution to a business criterion.
Calculation of the Compliance values
Compliance value for a rule:
// Compliance grade is introduced since 8.3.29. // if the compliance grade cannot be calculated we return the null value, so that it is not taken into account for parent quality indicators function computeRuleComplianceScore (nbFailedChecks, nbTotalChecks) { if (nbFailedChecks == 0 || nbTotalChecks == 0) return null ; // wrong rule if (nbTotalChecks <= nbFailedChecks) return null; // wrong rule or nbFailedCheks == nbTotalChecks return (1.0 - nbFailedChecks / nbTotalChecks); }
For technical criteria, and business criteria:
// From AIP 8.3.29 function computeComplianceScore (contributions) { // Calculate average of all contributions let sum = 0.0; let totalWeights = 0.0; for (let i = 0, len = contributions.length; i < len; i++) { let contribution = contributions[i]; let weight = contribution.weight; let score = contribution.complianceScore; if (weight == 0.0) continue; // do not take into account zero weight if (!grade) continue; // do not take into account null/zero grade (when all contributors have a zero weight) sum += score ; totalWeights += weight; } if (totalWeights == 0.0) return null; // grade is null when all weights are zero return (sum / contributions.length); // simple average }