public virtual void of_construction_additive_1()
        {
            InflationNodalCurve curveComputed = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_1, LAST_FIX_MONTH_1, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF);

            assertEquals(curveComputed.Underlying.XValues.get(0), NB_MONTHS_1, TOLERANCE_TIME);
            assertEquals(curveComputed.Underlying.YValues.get(0), LAST_FIX_VALUE, TOLERANCE_TIME);
            assertEquals(curveComputed.yValue(NB_MONTHS_1), LAST_FIX_VALUE, TOLERANCE_TIME);
        }
        public virtual void of_construction_multiplicative_2()
        {
            InflationNodalCurve curveComputed = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_MULTIPLICATIVE_DEF);

            assertEquals(curveComputed.Underlying.XValues.get(0), NB_MONTHS_2, TOLERANCE_TIME);
            assertEquals(curveComputed.Underlying.YValues.get(0), LAST_FIX_VALUE, TOLERANCE_TIME);
            assertEquals(curveComputed.yValue(NB_MONTHS_2), LAST_FIX_VALUE, TOLERANCE_TIME);
        }
        public virtual void value_multiplicative()
        {
            InflationNodalCurve curveComputed = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_MULTIPLICATIVE_DEF);

            for (int i = 1; i < TEST_MONTHS.Length; i++)
            {
                double nbMonths      = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS);
                double valueComputed = curveComputed.yValue(nbMonths);
                int    x             = (int)((nbMonths + 12) % 12);
                double valueNoAdj    = EXTENDED_CURVE_2.yValue(nbMonths);
                double adj           = SEASONALITY_MULTIPLICATIVE_COMP_2.get(x);
                double valueExpected = valueNoAdj * adj;
                assertEquals(valueExpected, valueComputed, TOLERANCE_VALUE);
            }
        }
        public virtual void value_additive()
        {
            InflationNodalCurve curveComputed = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF);

            for (int i = 1; i < TEST_MONTHS.Length; i++)
            {
                double      nbMonths      = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS);
                double      valueComputed = curveComputed.yValue(nbMonths);
                int         x             = (int)((nbMonths + 12) % 12);
                double      valueNoAdj    = EXTENDED_CURVE_2.yValue(nbMonths);
                DoubleArray seasonalityAdditiveCompounded = seasonalityCompounded(VAL_DATE_2, LAST_FIX_MONTH_2, SEASONALITY_ADDITIVE, (v, a) => v + a);
                double      adj           = seasonalityAdditiveCompounded.get(x);
                double      valueExpected = valueNoAdj + adj;
                assertEquals(valueExpected, valueComputed, TOLERANCE_VALUE);
            }
        }
        public virtual void parameter_sensitivity_additive()
        {
            InflationNodalCurve curve = InflationNodalCurve.of(CURVE_NOFIX, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF);
            double shift = 1.0E-2;

            for (int i = 1; i < TEST_MONTHS.Length; i++)
            {
                double nbMonths = YearMonth.from(VAL_DATE_2).until(TEST_MONTHS[i], MONTHS);
                UnitParameterSensitivity psComputed = curve.yValueParameterSensitivity(nbMonths);
                for (int j = 0; j < TIMES.size(); j++)
                {
                    double[] valuePM = new double[2];
                    for (int pm = 0; pm < 2; pm++)
                    {
                        DoubleArray            shiftedValues   = VALUES.with(j, VALUES.get(j) + (1 - 2 * pm) * shift);
                        InterpolatedNodalCurve intCurveShifted = InterpolatedNodalCurve.of(METADATA, TIMES, shiftedValues, INTERPOLATOR);
                        InflationNodalCurve    seaCurveShifted = InflationNodalCurve.of(intCurveShifted, VAL_DATE_2, LAST_FIX_MONTH_2, LAST_FIX_VALUE, SEASONALITY_ADDITIVE_DEF);
                        valuePM[pm] = seaCurveShifted.yValue(nbMonths);
                    }
                    assertEquals(psComputed.Sensitivity.get(j), (valuePM[0] - valuePM[1]) / (2 * shift), TOLERANCE_DELTA);
                }
            }
        }