scoreCalculator.js 2.5 KB

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