scoreCalculator.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. var Q = require('q');
  2. var debug = require('debug')('ylt:scoreCalculator');
  3. var ScoreCalculator = function() {
  4. 'use strict';
  5. this.calculate = function(data, profile) {
  6. var results = {
  7. categories: {}
  8. };
  9. var categoryScore;
  10. var categoryName;
  11. var weight;
  12. debug('Starting calculating scores');
  13. // Calculate categories
  14. for (categoryName in profile.categories) {
  15. var categoryResult = {
  16. label: profile.categories[categoryName].label
  17. };
  18. categoryScore = new ScoreMerger();
  19. var rules = [];
  20. var policyScore;
  21. for (var policyName in profile.categories[categoryName].policies) {
  22. weight = profile.categories[categoryName].policies[policyName];
  23. if (data.rules[policyName]) {
  24. policyScore = data.rules[policyName].score + (data.rules[policyName].abnormalityScore * 2);
  25. categoryScore.push(policyScore, weight);
  26. } else {
  27. debug('Warning: could not find rule %s', policyName);
  28. }
  29. rules.push(policyName);
  30. }
  31. categoryResult.categoryScore = categoryScore.getScore();
  32. categoryResult.rules = rules;
  33. results.categories[categoryName] = categoryResult;
  34. }
  35. // Calculate general score
  36. var globalScore = new ScoreMerger();
  37. for (categoryName in profile.globalScore) {
  38. weight = profile.globalScore[categoryName];
  39. if (results.categories[categoryName]) {
  40. globalScore.push(results.categories[categoryName].categoryScore, weight);
  41. }
  42. }
  43. results.globalScore = Math.round(globalScore.getScore());
  44. debug('Score calculation finished:');
  45. debug(results);
  46. return results;
  47. };
  48. var ScoreMerger = function() {
  49. var sum = 0;
  50. var totalWeight = 0;
  51. this.push = function(score, weight) {
  52. sum += (100 - score) * weight;
  53. totalWeight += weight;
  54. };
  55. this.getScore = function() {
  56. if (totalWeight === 0) {
  57. return 100;
  58. }
  59. return Math.round(100 - (sum / totalWeight));
  60. };
  61. };
  62. };
  63. module.exports = new ScoreCalculator();