public MetricsModel CalculateProjectMetrics( IEnumerable <ActivityModel> activities, IEnumerable <ActivitySeverityModel> activitySeverities) { if (activities == null) { throw new ArgumentNullException(nameof(activities)); } if (activitySeverities == null) { throw new ArgumentNullException(nameof(activitySeverities)); } var activitySeverityLookup = new ActivitySeverityLookup(activitySeverities); return(new MetricsModel { Criticality = CalculateCriticalityRisk(activities, activitySeverityLookup), Fibonacci = CalculateFibonacciRisk(activities, activitySeverityLookup), Activity = CalculateActivityRisk(activities), ActivityStdDevCorrection = CalculateActivityRiskWithStdDevCorrection(activities), GeometricCriticality = CalculateGeometricCriticalityRisk(activities, activitySeverityLookup), GeometricFibonacci = CalculateGeometricFibonacciRisk(activities, activitySeverityLookup), GeometricActivity = CalculateGeometricActivityRisk(activities), }); }
private static double CalculateFibonacciRisk( IEnumerable <ActivityModel> activities, ActivitySeverityLookup activitySeverityLookup) { if (activities == null) { throw new ArgumentNullException(nameof(activities)); } if (activitySeverityLookup == null) { throw new ArgumentNullException(nameof(activitySeverityLookup)); } double numerator = activities.Sum(activity => activitySeverityLookup.FindSlackFibonacciWeight(activity.TotalSlack)); double denominator = activitySeverityLookup.CriticalFibonacciWeight() * activities.Count(); return(numerator / denominator); }
private static double CalculateGeometricFibonacciRisk( IEnumerable <ActivityModel> activities, ActivitySeverityLookup activitySeverityLookup) { if (activities == null) { throw new ArgumentNullException(nameof(activities)); } if (activitySeverityLookup == null) { throw new ArgumentNullException(nameof(activitySeverityLookup)); } double numerator = 1.0; foreach (ActivityModel activity in activities) { numerator *= activitySeverityLookup.FindSlackFibonacciWeight(activity.TotalSlack); } numerator = Math.Pow(numerator, 1.0 / activities.Count()); double denominator = activitySeverityLookup.CriticalFibonacciWeight(); return(numerator / denominator); }