private void OptimizationFunction_AD(double[] curveValues, ref double func, double[] grad, object obj) { _internalState += 1; if (_internalState > _internalStateMax) { return; } List <List <double> > curveValueCollection = new List <List <double> >(); int n = 0; // Update curve values to newest iteration for (int i = 0; i < _currentCurvePoints.Length; i++) { List <double> temp = new List <double>(); for (int j = 0; j < _currentCurvePoints[i]; j++) { temp.Add(curveValues[n]); n += 1; } curveValueCollection.Add(temp); } for (int i = 0; i < _currentCurvePoints.Length; i++) { _fwdCurveCollection.UpdateCurveValues(curveValueCollection[i], _currentTenors[i]); } // Initialize temporary LinearRateModel with new curves. LinearRateModel tempModel = new LinearRateModel(_discCurve, _fwdCurveCollection, _settings.Interpolation); tempModel.ADFwdCurveCollection = new ADFwdCurveContainer(); tempModel.SetAdDiscCurveFromOrdinaryCurve(); n = 0; // Create ADouble array of curve values - active variables. List <ADouble> curveValuesAd = new List <ADouble>(); for (int i = 0; i < _currentCurvePoints.Length; i++) { for (int j = 0; j < _currentCurvePoints[i]; j++) { curveValuesAd.Add(new ADouble(curveValues[n])); n += 1; } } AADTape.ResetTape(); AADTape.Initialize(curveValuesAd.ToArray()); // Set curves in tempModel that has already been calibrated. foreach (CurveTenor tempTenor in _hasBeenCalibrated.Keys) { if (_hasBeenCalibrated[tempTenor]) { Curve tempCurve = _fwdCurveCollection.GetCurve(tempTenor).Copy(); List <ADouble> tempValues = new List <ADouble>(); for (int i = 0; i < _fwdCurveCollection.GetCurve(tempTenor).Values.Count; i++) { tempValues.Add(new ADouble(_fwdCurveCollection.GetCurve(tempTenor).Values[i])); } Curve_AD tempADCurve = new Curve_AD(_fwdCurveCollection.GetCurve(tempTenor).Dates, tempValues); tempModel.ADFwdCurveCollection.AddCurve(tempADCurve, tempTenor); } } n = 0; // Convert active ADouble variables to curves in the temporary model for (int i = 0; i < _currentCurvePoints.Length; i++) { List <ADouble> tempADouble = new List <ADouble>(); for (int j = 0; j < _currentCurvePoints[i]; j++) { tempADouble.Add(curveValuesAd[n]); n += 1; } tempModel.ADFwdCurveCollection.AddCurve(new Curve_AD(_fwdCurveCollection.GetCurve(_currentTenors[i]).Dates, tempADouble), _currentTenors[i]); } // Evaluate goal function and obtain gradient. func = GoalFunction_AD(_currentTenors, tempModel); AADTape.InterpretTape(); double[] gradient = AADTape.GetGradient(); for (int i = 0; i < gradient.Length; i++) { grad[i] = gradient[i]; } AADTape.ResetTape(); }
private void OptimizationFunction_AD_Current_OLD(double[] curveValues, ref double func, double[] grad, object obj) { // This is a working optimizationFunction that does not work with order. // Kept as reference in case something goes wrong with the more general implementation. _internalState += 1; if (_internalState > _internalStateMax) { return; } List <List <double> > curveValueCollection = new List <List <double> >(); List <ADouble> curveValuesAd = new List <ADouble>(); int n = 0; for (int i = 0; i < _currentCurvePoints.Length; i++) { List <double> temp = new List <double>(); for (int j = 0; j < _currentCurvePoints[i]; j++) { temp.Add(curveValues[n]); curveValuesAd.Add(new ADouble(curveValues[n])); n += 1; } curveValueCollection.Add(temp); } for (int i = 0; i < _currentCurvePoints.Length; i++) { _fwdCurveCollection.UpdateCurveValues(curveValueCollection[i], _currentTenors[i]); } AADTape.ResetTape(); LinearRateModel tempModel = new LinearRateModel(_discCurve, _fwdCurveCollection, _settings.Interpolation); tempModel.ADFwdCurveCollection = new ADFwdCurveContainer(); AADTape.Initialize(curveValuesAd.ToArray()); tempModel.SetAdDiscCurveFromOrdinaryCurve(); n = 0; for (int i = 0; i < _currentCurvePoints.Length; i++) { List <ADouble> tempADouble = new List <ADouble>(); for (int j = 0; j < _currentCurvePoints[i]; j++) { tempADouble.Add(curveValuesAd[n]); n += 1; } tempModel.ADFwdCurveCollection.AddCurve(new Curve_AD(_fwdCurveCollection.GetCurve(_currentTenors[i]).Dates, tempADouble), _currentTenors[i]); } func = GoalFunction_AD(_currentTenors, tempModel); AADTape.InterpretTape(); double[] gradient = AADTape.GetGradient(); for (int i = 0; i < gradient.Length; i++) { grad[i] = gradient[i]; } AADTape.ResetTape(); }