S-Curve Calibrator
Purpose
To calibrate an S-Curve Progression model using an observation of age and distress percent.
This JFunction should be used only during the Model Initialisation stage, when we extract the current, known/observed, distress states for each model element into model parameter values. In doing this, we posess valuable information which can be used to update our theoretically determined S-curve models.
This concept is shown schematically in Figure 1 below. In this figure, we show our presumed/theoretical S-Curve Model with its assumed values for AADI (Age to Distress Initialisation), Initial Distress Value and T100 (time to reach 100% distress).
The three red dots show three different scenarios, each representing a different initial observed state. The three cases are:
Case A: In this case, our initial observed data shows that our model has over-estimated AADI and the Initial Value. The model can be calibrated for this element by shortening AADI and possible increasing the Initial Value, and perhaps also T100.
Case B: Here the model is too conservative compared to what is actually observed. The observed point shows that distress is still zero at the observed age which is beyond the expected AADI. In this case, the S-curve model for this element should be calibrated by increasing AADI.
Case C: Here the model is too conservative compared to what is actually observed. The observed point shows that distress has initialised but is lower than predicted by the model. In this case, the S-curve model for this element should be calibrated by increasing AADI and/or T100 (or a combination of both).
Note that the one shown in Figure 1 as ‘Case D’ (green dot) represents a situation where the observed age has not yet reached AADI and the observed distress is still zero. In such a case, the observed distress and age combination does not conflict with the assumed S-Curve Model and thus an adjustment of the assumed AADI, Initial Distress or T100 is not warranted.
It is the job of the S-Curve Calibration function to automate the above noted calibrations by performing a search for the AADI, Initival Values and T100 that will bring the S-Curve model into alignment with what is observed. This is done during the model initialisation stage for each element using the observed age and distress values.
To do the calibration, the S-Curve Calibration JFunction needs to know several things:
- What is the current age and distress value for the element;
- What is the current expected values for AADI, Initial Distress and T100.
- What are the allowed ranges (minima and maxima) for AADI, Initial Distress and T100.
The above comprise 11 parameters in total, which makes the setup definition for the S-Curve Calibration JFunction seem complex. However, proper understanding of why these parameters are needed, and the role they play in the calibration makes it easier.
Type Name
‘s_progression_calibration’
Definition Syntax
The definition syntac for the S-Curve Calibrator is to provide three groups of data each representing the expected value, minimum and maximum for each of AADI, Initial Distress and T100. Values within groups are delimited by a pipe-symbol, while the groups themselves are delimited by a colon, as shown below. A final group, also delimited by a pipe-symbol, provides details for the observed age and distress as well as a error tolerance for the calibration search:
[aadi_exp] | [aadi_min] | [aadi_max] : [init_val_exp] | [init_val_min] | [init_val_max] : [T100_exp] | [T100_min] | [T100_max] : [age_key] | [distress_key] | [error_tolerance]
where:
- ‘aadi_exp’ is the current, expected value for AADI. The value provided here can be a constant or number, of a key that maps to one of the pre-defined or pre-calculated values in the value dictionary.
- ‘aadi_min’ is the minimum allowed value for AADI within which the calibration search should be constrained. The value provided here can be a constant or number, of a key that maps to one of the pre-defined or pre-calculated values in the value dictionary.
- ‘aadi_max’ is the maximum allowed value for AADI within which the calibration search should be constrained. The value provided here can be a constant or number, of a key that maps to one of the pre-defined or pre-calculated values in the value dictionary.
- ‘init_val_exp’, ‘init_val_min’ and ‘init_val_min’ is the expected, minimum allowed and maximum allowed values for the Initial Distress value in the S-Curve Model, with meaning similar to the explanation for AADI above.
- ‘T100_exp’, ‘T100_min’ and ‘T100_max’ is the expected, minimum allowed and maximum allowed values for T!00 value in the S-Curve Model, with meaning similar to the explanation for AADI above.
- ‘error_tolerance’ is the error tolerance for the search to calibrate the S-curve model. Lower values will mean longer search times. For distress types that typically have percentages in the range of 1% to 30%, it is recommended that an error tolerance of 1.0 (meaning within 1%) be used. For distresses such as potholes, for which the percentage distress is lower (typically in the range of 0.05 to 5%), it is recommended that a error tolerance of 0.05% be used. NOTE THAT this value must be a number and cannot be a key that maps to the value dictionary.
Results Returned
This JFunction will return the calibrated values for AADI, Initial Value and T100 as a single text code with the format:
‘aadi _ init_val _ T100’
where:
- ‘aadi’: is the AADI value after calibration, rounded to two decimals;
- ‘init_val’: is the Initial Distress value after calibration, rounded to two decimals;
- ‘T100i’: is the T100 value after calibration, rounded to two decimals;
For example, the function may return a code such as ‘12.33 _ 0.8 _ 78.52’ which indicates that after calibration to take account of the observed situation for this element, the estimated AADI is 12.33 years/periods, the initial distress value is 0.8% and the T100 is estimated to be 78.52 years/periods.
You will, of course, want to use these values as the initial AADI, Init.Value and T100 values for your model, and therefore you will need to parse out the results from this JFunction into three separate values and assign them to the individual keys for AADI, Init.Value and T100.
To do this, you can use the Split-and-Select JFunction which will allow you to extract the first, second and third elements of the coded result string into separate values.
Example
The example below uses mostly explicit numerical values setup parameters to make the example easier to understand. In a real-world model, these numbers should ideally be replaced by JFunction keys mapping to predefined functions or constants in the value dictionary.
’12|6|16 : 1.5|0.5|3 : 50|25|100 : par_surf_age|par_crack_percent|1.0
In this example, the current expected value for AADI is 12. If calibration needs to be done (cases A, B and C shown in Figure 1 above), the search for a better AADI will be constrained to the range of 6 to 16 years/periods.
Similarly the current expected value for Initial Distress at initiation is 1.5%. If calibration needs to be done, the search for a better Initial Distress value will be constrained to the range of 0.5 to 3%.
Similarly the current expected value for T100 is 50 years/periods. If calibration needs to be done, the search for a better T100 will be constrained to the range of 25 to 100 years/periods.
Finally, the example setup shows that the current age for the element will be extracted from the key ‘par_surf_age’ in the value dictionary. The observed value for the distress will be extracted from the value dictionary using the key ‘par_crack_percent’.
The final ‘1.0’ specified in the setup code tells JCass that the calibration search can be terminated when the prediction made by the calibrated S-Curve Model is within 1.0% of the observed value.