public MetricsDto CalculateProjectMetrics( IList <IActivity <int> > activities, IList <ActivitySeverityDto> activitySeverityDtos) { if (activities == null) { throw new ArgumentNullException(nameof(activities)); } if (activitySeverityDtos == null) { throw new ArgumentNullException(nameof(activitySeverityDtos)); } var activitySeverityLookup = new ActivitySeverityLookup(activitySeverityDtos); return(new MetricsDto { 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(IList <IActivity <int> > 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(IList <IActivity <int> > activities, ActivitySeverityLookup activitySeverityLookup) { if (activities == null) { throw new ArgumentNullException(nameof(activities)); } if (activitySeverityLookup == null) { throw new ArgumentNullException(nameof(activitySeverityLookup)); } double numerator = 1.0; foreach (Activity <int> activity in activities) { numerator *= activitySeverityLookup.FindSlackFibonacciWeight(activity.TotalSlack); } numerator = Math.Pow(numerator, 1.0 / activities.Count); double denominator = activitySeverityLookup.CriticalFibonacciWeight(); return(numerator / denominator); }