public override double?[] GetUnits(int startFiscalYear, int months, TimeInvariantInputDTO timeInvariantData, IReadOnlyList <TimeVariantInputDTO> timeVariantData) { var answers = timeVariantData.FirstOrDefault(); double estimatedDesignLife = timeInvariantData.Design_32_Life; TimeVariantLocalConditionDTO localTimeInvariantData = new TimeVariantLocalConditionDTO(answers.Condition, answers.TimePeriod); /*IReadOnly*/ 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); // From Zeus v18 var monthlyConditionScores = MonthlyConditionScores <TimeVariantLocalConditionDTO>( startFiscalYear, months, null, // assetInServiceDate localTimeInvariantDataList, conditionDecayCurve, x => x.ConditionScoreLocal); return(monthlyConditionScores); }
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)); }
public static XYCurveDTO constructGenericEndOfLifePofCurve() { // Construct a generic end of life condition to failure curve. int numPoints = 11; double mAHI = (CustomerConstants.BestConditionScore + CustomerConstants.WorstConditionScore) / 2.0; // Midpoint Of AHI Scale, aka mAHI, aka m double theta = 0.463; // Convexity Of Curve double curveBias = 0.22; // (s) XYCurveDTO eomConditionToFailureCurve = new XYCurveDTO(); // eomConditionToFailureCurve.Id // eomConditionToFailureCurve.Name // eomConditionToFailureCurve.CurveType CurvePointDTO[] points = new CurvePointDTO[numPoints]; for (int i = 0; i < numPoints; i++) { points[i] = new CurvePointDTO(); points[i].X = // Condition CustomerConstants.WorstConditionScore + i * (CustomerConstants.BestConditionScore - CustomerConstants.WorstConditionScore) / (numPoints - 1); points[i].Y = // PoF Math.Exp(mAHI) / (1 + Math.Exp(mAHI + curveBias + theta * points[i].X)); } eomConditionToFailureCurve.Points = points; return(eomConditionToFailureCurve); }
/// <summary> /// // Construct a generic end of life condition decay curve, based on the design life entered by the user. /// </summary> /// <param name="estimatedDesignLife">Asset's estimated design life in years</param> /// <returns>Generated condition decay curve</returns> public static XYCurveDTO constructConditionDecayCurve(double estimatedDesignLife) { XYCurveDTO conditionDecayCurve = new XYCurveDTO(); CurvePointDTO[] points = new CurvePointDTO[3]; points[0] = new CurvePointDTO(); points[0].X = 0; points[0].Y = 10.0; // - - - - - - - - - - -> When brand new, the asset is in perfect condition points[1] = new CurvePointDTO(); points[1].X = estimatedDesignLife; // - - - -> When at its design life, the asset has a condition of 3 points[1].Y = 3.0; points[2] = new CurvePointDTO(); points[2].X = estimatedDesignLife / 0.7; // -> When past its design life (assuming linear degradation), Design Life/0.7 corresponds to a condition of 0 points[2].Y = 0.0; conditionDecayCurve.Points = points; return(conditionDecayCurve); }
public override double?[] GetUnits(int startFiscalYear, int months, TimeInvariantInputDTO timeInvariantData, IReadOnlyList <TimeVariantInputDTO> timeVariantData) { var estimatedDesignLifeMeasure = timeInvariantData.Transmission_32_Station_32_Equipment_32_Risk_Transmission_32_Station_32__45__32_Design_32_Life_ConsqUnitOutput_B; if (estimatedDesignLifeMeasure == null) { return(null); } double estimatedDesignLife = estimatedDesignLifeMeasure[0].Value; double defaultOutcomeCondition = 10.0; TimePeriodDTO timePeriod = new TimePeriodDTO(); var endOfSpendMonthOffset = FindEndOfSpendMonth(timeInvariantData.InvestmentSpendByAccountType); if (!endOfSpendMonthOffset.HasValue) { return(null); } timePeriod.StartTime = 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(defaultOutcomeCondition, 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)); }