diff --git a/LICENSE.md b/LICENSE.md index 6b9f0519..cd1ac9ed 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,7 +1,7 @@ Math.NET Numerics License (MIT/X11) =================================== -Copyright (c) 2002-2018 Math.NET +Copyright (c) 2002-2019 Math.NET Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/src/Numerics.Tests/OptimizationTests/NonLinearCurveFittingTests.cs b/src/Numerics.Tests/OptimizationTests/NonLinearCurveFittingTests.cs index 2b7b553d..be459413 100644 --- a/src/Numerics.Tests/OptimizationTests/NonLinearCurveFittingTests.cs +++ b/src/Numerics.Tests/OptimizationTests/NonLinearCurveFittingTests.cs @@ -1,6 +1,7 @@ using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.LinearAlgebra.Double; using MathNet.Numerics.Optimization; +using MathNet.Numerics.Optimization.TrustRegion; using NUnit.Framework; using System; @@ -441,7 +442,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests #region Thurber // model : Thurber (https://www.itl.nist.gov/div898/strd/nls/data/thurber.shtml) - // f(x; b1 ... b7) = (b1 + b2*x + b3*x^2 + b4*x^3) / (1 + b5*x + b6*x^2 + b7*x^3) + // f(x; b1 ... b7) = (b1 + b2*x + b3*x^2 + b4*x^3) / (1 + b5*x + b6*x^2 + b7*x^3) // derivatives: // df/db1 = 1/(b5*x + b6*x^2 + b7*x^3 + 1) // df/db2 = x/(b5*x + b6*x^2 + b7*x^3 + 1) @@ -548,7 +549,7 @@ namespace MathNet.Numerics.UnitTests.OptimizationTests AssertHelpers.AlmostEqualRelative(ThurberPstd[i], result.StandardErrors[i], 6); } } - + [Test] public void Thurber_TRDL_Dif() { diff --git a/src/Numerics/Optimization/ITrustRegionSubProblem.cs b/src/Numerics/Optimization/TrustRegion/ITrustRegionSubProblem.cs similarity index 82% rename from src/Numerics/Optimization/ITrustRegionSubProblem.cs rename to src/Numerics/Optimization/TrustRegion/ITrustRegionSubProblem.cs index 5305fc44..15191337 100644 --- a/src/Numerics/Optimization/ITrustRegionSubProblem.cs +++ b/src/Numerics/Optimization/TrustRegion/ITrustRegionSubProblem.cs @@ -1,6 +1,6 @@ using MathNet.Numerics.LinearAlgebra; -namespace MathNet.Numerics.Optimization +namespace MathNet.Numerics.Optimization.TrustRegion { public interface ITrustRegionSubproblem { diff --git a/src/Numerics/Optimization/Subproblems/DogLegSubproblem.cs b/src/Numerics/Optimization/TrustRegion/Subproblems/DogLegSubproblem.cs similarity index 96% rename from src/Numerics/Optimization/Subproblems/DogLegSubproblem.cs rename to src/Numerics/Optimization/TrustRegion/Subproblems/DogLegSubproblem.cs index ce1ac838..e01b689b 100644 --- a/src/Numerics/Optimization/Subproblems/DogLegSubproblem.cs +++ b/src/Numerics/Optimization/TrustRegion/Subproblems/DogLegSubproblem.cs @@ -1,6 +1,6 @@ using MathNet.Numerics.LinearAlgebra; -namespace MathNet.Numerics.Optimization.Subproblems +namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems { internal class DogLegSubproblem : ITrustRegionSubproblem { diff --git a/src/Numerics/Optimization/Subproblems/NewtonCGSubproblem.cs b/src/Numerics/Optimization/TrustRegion/Subproblems/NewtonCGSubproblem.cs similarity index 93% rename from src/Numerics/Optimization/Subproblems/NewtonCGSubproblem.cs rename to src/Numerics/Optimization/TrustRegion/Subproblems/NewtonCGSubproblem.cs index 73149818..acbf83ce 100644 --- a/src/Numerics/Optimization/Subproblems/NewtonCGSubproblem.cs +++ b/src/Numerics/Optimization/TrustRegion/Subproblems/NewtonCGSubproblem.cs @@ -1,7 +1,7 @@ -using MathNet.Numerics.LinearAlgebra; -using System; +using System; +using MathNet.Numerics.LinearAlgebra; -namespace MathNet.Numerics.Optimization.Subproblems +namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems { internal class NewtonCGSubproblem : ITrustRegionSubproblem { diff --git a/src/Numerics/Optimization/Subproblems/Util.cs b/src/Numerics/Optimization/TrustRegion/Subproblems/Util.cs similarity index 82% rename from src/Numerics/Optimization/Subproblems/Util.cs rename to src/Numerics/Optimization/TrustRegion/Subproblems/Util.cs index 4ea986f8..6cc116fa 100644 --- a/src/Numerics/Optimization/Subproblems/Util.cs +++ b/src/Numerics/Optimization/TrustRegion/Subproblems/Util.cs @@ -1,16 +1,16 @@ -using MathNet.Numerics.LinearAlgebra; -using System; +using System; +using MathNet.Numerics.LinearAlgebra; -namespace MathNet.Numerics.Optimization.Subproblems +namespace MathNet.Numerics.Optimization.TrustRegion.Subproblems { internal static class Util { public static Tuple FindBeta(double alpha, Vector sd, Vector gn, double delta) { // Pstep is intersection of the trust region boundary - // Pstep = α*Psd + β*(Pgn - α*Psd) + // Pstep = α*Psd + β*(Pgn - α*Psd) // find r so that ||Pstep|| = Δ - // z = α*Psd, d = (Pgn - z) + // z = α*Psd, d = (Pgn - z) // (d^2)β^2 + (2*z*d)β + (z^2 - Δ^2) = 0 // // positive β is used for the quadratic formula diff --git a/src/Numerics/Optimization/TrustRegionDogLegMinimizer.cs b/src/Numerics/Optimization/TrustRegion/TrustRegionDogLegMinimizer.cs similarity index 91% rename from src/Numerics/Optimization/TrustRegionDogLegMinimizer.cs rename to src/Numerics/Optimization/TrustRegion/TrustRegionDogLegMinimizer.cs index 77a220f0..c07fffaa 100644 --- a/src/Numerics/Optimization/TrustRegionDogLegMinimizer.cs +++ b/src/Numerics/Optimization/TrustRegion/TrustRegionDogLegMinimizer.cs @@ -1,4 +1,4 @@ -namespace MathNet.Numerics.Optimization +namespace MathNet.Numerics.Optimization.TrustRegion { public sealed class TrustRegionDogLegMinimizer : TrustRegionMinimizerBase { diff --git a/src/Numerics/Optimization/TrustRegionMinimizerBase.cs b/src/Numerics/Optimization/TrustRegion/TrustRegionMinimizerBase.cs similarity index 96% rename from src/Numerics/Optimization/TrustRegionMinimizerBase.cs rename to src/Numerics/Optimization/TrustRegion/TrustRegionMinimizerBase.cs index 1ab8eb36..f6e9fbdd 100644 --- a/src/Numerics/Optimization/TrustRegionMinimizerBase.cs +++ b/src/Numerics/Optimization/TrustRegion/TrustRegionMinimizerBase.cs @@ -1,14 +1,14 @@ -using MathNet.Numerics.LinearAlgebra; -using System; +using System; using System.Collections.Generic; using System.Linq; +using MathNet.Numerics.LinearAlgebra; -namespace MathNet.Numerics.Optimization +namespace MathNet.Numerics.Optimization.TrustRegion { public abstract class TrustRegionMinimizerBase : NonlinearMinimizerBase { /// - /// The trust region subproblem. + /// The trust region subproblem. /// public static ITrustRegionSubproblem Subproblem; @@ -51,7 +51,7 @@ namespace MathNet.Numerics.Optimization /// Non-linear least square fitting by the trust-region algorithm. /// /// The objective model, including function, jacobian, observations, and parameter bounds. - /// The subproblem + /// The subproblem /// The initial guess values. /// The stopping threshold for L2 norm of the residuals. /// The stopping threshold for infinity norm of the gradient vector. @@ -112,7 +112,7 @@ namespace MathNet.Numerics.Optimization // First, calculate function values and setup variables var P = ProjectToInternalParameters(initialGuess); // current internal parameters - var Pstep = Vector.Build.Dense(P.Count); // the change of parameters + var Pstep = Vector.Build.Dense(P.Count); // the change of parameters var RSS = EvaluateFunction(objective, initialGuess); // Residual Sum of Squares if (maximumIterations < 0) @@ -127,7 +127,7 @@ namespace MathNet.Numerics.Optimization return new NonlinearMinimizationResult(objective, -1, exitCondition); } - // When only function evaluation is needed, set maximumIterations to zero, + // When only function evaluation is needed, set maximumIterations to zero, if (maximumIterations == 0) { exitCondition = ExitCondition.ManuallyStopped; @@ -142,7 +142,7 @@ namespace MathNet.Numerics.Optimization // evaluate projected gradient and Hessian var jac = EvaluateJacobian(objective, P); var Gradient = jac.Item1; // objective.Gradient; - var Hessian = jac.Item2; // objective.Hessian; + var Hessian = jac.Item2; // objective.Hessian; // if ||g||_oo <= gtol, found and stop if (Gradient.InfinityNorm() <= gradientTolerance) @@ -182,7 +182,7 @@ namespace MathNet.Numerics.Optimization var Pnew = P + Pstep; // parameters to test // evaluate function at Pnew var RSSnew = EvaluateFunction(objective, Pnew); - + // if RSS == NaN, stop if (double.IsNaN(RSSnew)) { @@ -204,7 +204,7 @@ namespace MathNet.Numerics.Optimization delta = delta * 0.25; if (delta <= radiusTolerance * (radiusTolerance + P.DotProduct(P))) { - exitCondition = ExitCondition.LackOfProgress; + exitCondition = ExitCondition.LackOfProgress; break; } } diff --git a/src/Numerics/Optimization/TrustRegionNewtonCGMinimizer.cs b/src/Numerics/Optimization/TrustRegion/TrustRegionNewtonCGMinimizer.cs similarity index 91% rename from src/Numerics/Optimization/TrustRegionNewtonCGMinimizer.cs rename to src/Numerics/Optimization/TrustRegion/TrustRegionNewtonCGMinimizer.cs index 7e6d5f5a..faee5548 100644 --- a/src/Numerics/Optimization/TrustRegionNewtonCGMinimizer.cs +++ b/src/Numerics/Optimization/TrustRegion/TrustRegionNewtonCGMinimizer.cs @@ -1,4 +1,4 @@ -namespace MathNet.Numerics.Optimization +namespace MathNet.Numerics.Optimization.TrustRegion { public sealed class TrustRegionNewtonCGMinimizer : TrustRegionMinimizerBase { @@ -10,4 +10,3 @@ { } } } - diff --git a/src/Numerics/Optimization/TrustRegionSubProblem.cs b/src/Numerics/Optimization/TrustRegion/TrustRegionSubProblem.cs similarity index 72% rename from src/Numerics/Optimization/TrustRegionSubProblem.cs rename to src/Numerics/Optimization/TrustRegion/TrustRegionSubProblem.cs index 3018f8b6..15055a8a 100644 --- a/src/Numerics/Optimization/TrustRegionSubProblem.cs +++ b/src/Numerics/Optimization/TrustRegion/TrustRegionSubProblem.cs @@ -1,6 +1,6 @@ -using MathNet.Numerics.Optimization.Subproblems; +using MathNet.Numerics.Optimization.TrustRegion.Subproblems; -namespace MathNet.Numerics.Optimization +namespace MathNet.Numerics.Optimization.TrustRegion { public static class TrustRegionSubproblem {