public override double?[] GetUnits(int startFiscalYear, int months, TimeInvariantInputDTO timeInvariantData, IReadOnlyList <TimeVariantInputDTO> timeVariantData) { // TODO: Pass this as a value measure var answers = timeVariantData.FirstOrDefault(); double estimatedDesignLife = timeInvariantData.Design_32_Life; CL.FormulaHelper.DTOs.TimePeriodDTO timePeriod = new CL.FormulaHelper.DTOs.TimePeriodDTO(); var endOfSpendMonthOffset = FormulaBase.FindEndOfSpendMonth(timeInvariantData.InvestmentSpendByAccountType); if (!endOfSpendMonthOffset.HasValue) { return(null); } timePeriod.StartTime = FormulaBase.GetCalendarDateTime(startFiscalYear, fiscalPeriod: 1) .AddMonths(endOfSpendMonthOffset.Value + 1); // + 1 because the benefit starts in the first month after end of spend. TimeVariantLocalConditionDTO localTimeInvariantData = new TimeVariantLocalConditionDTO(answers.Condition, timePeriod); List <TimeVariantLocalConditionDTO> localTimeInvariantDataList = new List <TimeVariantLocalConditionDTO>(); localTimeInvariantDataList.Add(localTimeInvariantData); // A generic end of life condition decay curve, generated based on the design life entered by user. XYCurveDTO conditionDecayCurve = HelperFunctions.GenericEndOfLifeModel.constructConditionDecayCurve(estimatedDesignLife); return(InterpolateCurve <TimeVariantLocalConditionDTO>(localTimeInvariantDataList, startFiscalYear, months, conditionDecayCurve, x => x.ConditionScoreLocal)); }