Skip to content

Commit 66f1b56

Browse files
committed
Fix missing variable copies in CreateNew() method of NonlinearObjectiveModel
1 parent 88c09c3 commit 66f1b56

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

src/Numerics/Optimization/ObjectiveFunction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ public static IObjectiveModel NonlinearModel(
245245
int? observationCount = null,
246246
int accuracyOrder = 2)
247247
{
248-
return new NonlinearObjectiveModel(residualFunction, jacobian, accuracyOrder, observationCount);
248+
return new NonlinearObjectiveModel(residualFunction, jacobian, observationCount, accuracyOrder);
249249
}
250250

251251
/// <summary>
@@ -303,7 +303,7 @@ public static IObjectiveFunction NonlinearFunction(
303303
int? observationCount = null,
304304
int accuracyOrder = 2)
305305
{
306-
var objective = new NonlinearObjectiveModel(residualFunction, jacobian, accuracyOrder, observationCount);
306+
var objective = new NonlinearObjectiveModel(residualFunction, jacobian, observationCount, accuracyOrder);
307307
return objective.ToObjectiveFunction();
308308
}
309309
}

src/Numerics/Optimization/ObjectiveFunctions/NonlinearObjectiveModel.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,14 @@ public NonlinearObjectiveModel(
170170
/// </summary>
171171
/// <param name="residualFunction">Function that directly calculates residuals from parameters</param>
172172
/// <param name="jacobian">Optional Jacobian of residual function</param>
173-
/// <param name="accuracyOrder">Accuracy order for numerical differentiation (1-6)</param>
174173
/// <param name="observationCount">Number of observations for degree of freedom calculation. If not provided,
175174
/// will use the length of residual vector, which may not be appropriate for all statistical calculations.</param>
175+
/// <param name="accuracyOrder">Accuracy order for numerical differentiation (1-6)</param>
176176
public NonlinearObjectiveModel(
177177
Func<Vector<double>, Vector<double>> residualFunction,
178178
Func<Vector<double>, Matrix<double>> jacobian = null,
179-
int accuracyOrder = 2,
180-
int? observationCount = null)
179+
int? observationCount = null,
180+
int accuracyOrder = 2)
181181
{
182182
_residualFunction = residualFunction ?? throw new ArgumentNullException(nameof(residualFunction));
183183
_residualJacobian = jacobian;
@@ -191,7 +191,7 @@ public IObjectiveModel Fork()
191191
{
192192
if (_useDirectResiduals)
193193
{
194-
return new NonlinearObjectiveModel(_residualFunction, _residualJacobian, _accuracyOrder, _observationCount)
194+
return new NonlinearObjectiveModel(_residualFunction, _residualJacobian, _observationCount, _accuracyOrder)
195195
{
196196
_coefficients = _coefficients,
197197
_hasFunctionValue = _hasFunctionValue,
@@ -230,11 +230,21 @@ public IObjectiveModel CreateNew()
230230
{
231231
if (_useDirectResiduals)
232232
{
233-
return new NonlinearObjectiveModel(_residualFunction, _residualJacobian, _accuracyOrder, _observationCount);
233+
return new NonlinearObjectiveModel(_residualFunction, _residualJacobian, _observationCount, _accuracyOrder)
234+
{
235+
IsFixed = IsFixed
236+
};
234237
}
235238
else
236239
{
237-
return new NonlinearObjectiveModel(_modelFunction, _modelDerivative, _accuracyOrder);
240+
return new NonlinearObjectiveModel(_modelFunction, _modelDerivative, _accuracyOrder)
241+
{
242+
ObservedX = ObservedX,
243+
ObservedY = ObservedY,
244+
Weights = Weights,
245+
L = L,
246+
IsFixed = IsFixed
247+
};
238248
}
239249
}
240250

@@ -457,6 +467,8 @@ void EvaluateFunction()
457467
/// </summary>
458468
void EvaluateJacobian()
459469
{
470+
var evaluations = 0;
471+
460472
if (_coefficients == null)
461473
{
462474
throw new InvalidOperationException("Cannot evaluate Jacobian: current parameters is not set.");
@@ -473,7 +485,7 @@ void EvaluateJacobian()
473485
else
474486
{
475487
// Calculate Jacobian numerically for residual function
476-
_jacobianValue = NumericalJacobianForResidual(Point, out var evaluations);
488+
_jacobianValue = NumericalJacobianForResidual(Point, out evaluations);
477489
FunctionEvaluations += evaluations;
478490
}
479491
}
@@ -489,7 +501,7 @@ void EvaluateJacobian()
489501
else
490502
{
491503
// numerical jacobian
492-
_jacobianValue = NumericalJacobian(Point, out var evaluations);
504+
_jacobianValue = NumericalJacobian(Point, out evaluations);
493505
FunctionEvaluations += evaluations;
494506
}
495507

@@ -537,7 +549,7 @@ void EvaluateJacobian()
537549
_gradientValue = -_jacobianValue.Transpose() * _residuals;
538550
}
539551

540-
// approximated Hessian, H = J'WJ + ∑LRiHi ~ J'WJ near the minimum
552+
// approximated Hessian, H = J'J + ∑Ri∇²Ri ~ J'J near the minimum
541553
_hessianValue = _jacobianValue.Transpose() * _jacobianValue;
542554
}
543555

@@ -606,7 +618,7 @@ Matrix<double> NumericalJacobianForResidual(Vector<double> parameters, out int e
606618

607619
var derivatives = Matrix<double>.Build.Dense(residualSize, NumberOfParameters);
608620
evaluationCount = 0;
609-
int totalEvaluations = 0;
621+
var totalEvaluations = 0;
610622

611623
// Process each residual component separately
612624
for (var i = 0; i < residualSize; i++)

0 commit comments

Comments
 (0)