Skip to content

Commit 53eae56

Browse files
committed
Switch many tuples to value tuples
1 parent 15fdb48 commit 53eae56

25 files changed

Lines changed: 120 additions & 142 deletions

src/FSharp.Tests/FitTests.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module FitTests =
1818
let y = x |> Array.map f
1919

2020
// LeastSquares.FitToLine(x,y)
21-
let a, b = Fit.line x y
21+
let struct (a, b) = Fit.line x y
2222
a |> should (equalWithin 1.0e-12) 4.0
2323
b |> should (equalWithin 1.0e-12) -1.5
2424

@@ -35,7 +35,7 @@ module FitTests =
3535
let y = [| 4.986; 2.347; 2.061; -2.995; -2.352; -5.782 |]
3636

3737
// LeastSquares.FitToLinearCombination(x, y, (fun z -> 1.0), (fun z -> Math.Sin(z)), (fun z -> Math.Cos(z)))
38-
let [a;b;c] = (x,y) ||> Fit.linear [(fun _ -> 1.0); (Math.Sin); (Math.Cos)]
38+
let [a;b;c] = (x,y) ||> Fit.linear [(fun _ -> 1.0); Math.Sin; Math.Cos]
3939
a |> should (equalWithin 1.0e-4) -0.287476
4040
b |> should (equalWithin 1.0e-4) 4.02159
4141
c |> should (equalWithin 1.0e-4) -1.46962

src/Numerics.Tests/OptimizationTests/NewtonMinimizerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public void FindMinimum_Rosenbrock_Easy()
101101
[Test]
102102
public void FindMinimum_Rosenbrock_Hard()
103103
{
104-
var obj = ObjectiveFunction.GradientHessian(point => Tuple.Create(RosenbrockFunction.Value(point), RosenbrockFunction.Gradient(point), RosenbrockFunction.Hessian(point)));
104+
var obj = ObjectiveFunction.GradientHessian(point => (RosenbrockFunction.Value(point), RosenbrockFunction.Gradient(point), RosenbrockFunction.Hessian(point)));
105105
var solver = new NewtonMinimizer(1e-5, 1000);
106106
var result = solver.FindMinimum(obj, new DenseVector(new[] { -1.2, 1.0 }));
107107

src/Numerics/Complex32.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -489,22 +489,21 @@ public Complex32 SquareRoot()
489489
/// <summary>
490490
/// Evaluate all square roots of this <c>Complex32</c>.
491491
/// </summary>
492-
public Tuple<Complex32, Complex32> SquareRoots()
492+
public (Complex32, Complex32) SquareRoots()
493493
{
494494
var principal = SquareRoot();
495-
return new Tuple<Complex32, Complex32>(principal, -principal);
495+
return (principal, -principal);
496496
}
497497

498498
/// <summary>
499499
/// Evaluate all cubic roots of this <c>Complex32</c>.
500500
/// </summary>
501-
public Tuple<Complex32, Complex32, Complex32> CubicRoots()
501+
public (Complex32, Complex32, Complex32) CubicRoots()
502502
{
503503
float r = (float)Math.Pow(Magnitude, 1d / 3d);
504504
float theta = Phase / 3;
505505
const float shift = (float)Constants.Pi2 / 3;
506-
return new Tuple<Complex32, Complex32, Complex32>(
507-
FromPolarCoordinates(r, theta),
506+
return (FromPolarCoordinates(r, theta),
508507
FromPolarCoordinates(r, theta + shift),
509508
FromPolarCoordinates(r, theta - shift));
510509
}

src/Numerics/ComplexExtensions.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -295,22 +295,21 @@ public static Complex SquareRoot(this Complex complex)
295295
/// <summary>
296296
/// Evaluate all square roots of this <c>Complex</c>.
297297
/// </summary>
298-
public static Tuple<Complex, Complex> SquareRoots(this Complex complex)
298+
public static (Complex, Complex) SquareRoots(this Complex complex)
299299
{
300300
var principal = SquareRoot(complex);
301-
return new Tuple<Complex, Complex>(principal, -principal);
301+
return (principal, -principal);
302302
}
303303

304304
/// <summary>
305305
/// Evaluate all cubic roots of this <c>Complex</c>.
306306
/// </summary>
307-
public static Tuple<Complex, Complex, Complex> CubicRoots(this Complex complex)
307+
public static (Complex, Complex, Complex) CubicRoots(this Complex complex)
308308
{
309309
var r = Math.Pow(complex.Magnitude, 1d/3d);
310310
var theta = complex.Phase/3;
311311
const double shift = Constants.Pi2/3;
312-
return new Tuple<Complex, Complex, Complex>(
313-
Complex.FromPolarCoordinates(r, theta),
312+
return (Complex.FromPolarCoordinates(r, theta),
314313
Complex.FromPolarCoordinates(r, theta + shift),
315314
Complex.FromPolarCoordinates(r, theta - shift));
316315
}

src/Numerics/FindMinimum.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// http://numerics.mathdotnet.com
44
// http://github.com/mathnet/mathnet-numerics
55
//
6-
// Copyright (c) 2009-2017 Math.NET
6+
// Copyright (c) 2009-2021 Math.NET
77
//
88
// Permission is hereby granted, free of charge, to any person
99
// obtaining a copy of this software and associated documentation
@@ -61,44 +61,44 @@ public static double OfScalarFunction(Func<double, double> function, double init
6161
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
6262
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.
6363
/// </summary>
64-
public static Tuple<double, double> OfFunction(Func<double, double, double> function, double initialGuess0, double initialGuess1, double tolerance = 1e-8, int maxIterations = 1000)
64+
public static (double P0, double P1) OfFunction(Func<double, double, double> function, double initialGuess0, double initialGuess1, double tolerance = 1e-8, int maxIterations = 1000)
6565
{
6666
var objective = ObjectiveFunction.Value(v => function(v[0], v[1]));
6767
var result = NelderMeadSimplex.Minimum(objective, CreateVector.Dense(new[] { initialGuess0, initialGuess1 }), tolerance, maxIterations);
68-
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1]);
68+
return (result.MinimizingPoint[0], result.MinimizingPoint[1]);
6969
}
7070

7171
/// <summary>
7272
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
7373
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.
7474
/// </summary>
75-
public static Tuple<double, double, double> OfFunction(Func<double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double tolerance = 1e-8, int maxIterations = 1000)
75+
public static (double P0, double P1, double P2) OfFunction(Func<double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double tolerance = 1e-8, int maxIterations = 1000)
7676
{
7777
var objective = ObjectiveFunction.Value(v => function(v[0], v[1], v[2]));
7878
var result = NelderMeadSimplex.Minimum(objective, CreateVector.Dense(new[] { initialGuess0, initialGuess1, initialGuess2 }), tolerance, maxIterations);
79-
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2]);
79+
return (result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2]);
8080
}
8181

8282
/// <summary>
8383
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
8484
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.
8585
/// </summary>
86-
public static Tuple<double, double, double, double> OfFunction(Func<double, double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double tolerance = 1e-8, int maxIterations = 1000)
86+
public static (double P0, double P1, double P2, double P3) OfFunction(Func<double, double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double tolerance = 1e-8, int maxIterations = 1000)
8787
{
8888
var objective = ObjectiveFunction.Value(v => function(v[0], v[1], v[2], v[3]));
8989
var result = NelderMeadSimplex.Minimum(objective, CreateVector.Dense(new[] { initialGuess0, initialGuess1, initialGuess2, initialGuess3 }), tolerance, maxIterations);
90-
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2], result.MinimizingPoint[3]);
90+
return (result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2], result.MinimizingPoint[3]);
9191
}
9292

9393
/// <summary>
9494
/// Find vector x that minimizes the function f(x) using the Nelder-Mead Simplex algorithm.
9595
/// For more options and diagnostics consider to use <see cref="NelderMeadSimplex"/> directly.
9696
/// </summary>
97-
public static Tuple<double, double, double, double, double> OfFunction(Func<double, double, double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double initialGuess4, double tolerance = 1e-8, int maxIterations = 1000)
97+
public static (double P0, double P1, double P2, double P3, double P4) OfFunction(Func<double, double, double, double, double, double> function, double initialGuess0, double initialGuess1, double initialGuess2, double initialGuess3, double initialGuess4, double tolerance = 1e-8, int maxIterations = 1000)
9898
{
9999
var objective = ObjectiveFunction.Value(v => function(v[0], v[1], v[2], v[3], v[4]));
100100
var result = NelderMeadSimplex.Minimum(objective, CreateVector.Dense(new[] { initialGuess0, initialGuess1, initialGuess2, initialGuess3, initialGuess4 }), tolerance, maxIterations);
101-
return Tuple.Create(result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2], result.MinimizingPoint[3], result.MinimizingPoint[4]);
101+
return (result.MinimizingPoint[0], result.MinimizingPoint[1], result.MinimizingPoint[2], result.MinimizingPoint[3], result.MinimizingPoint[4]);
102102
}
103103

104104
/// <summary>
@@ -144,7 +144,7 @@ public static Vector<double> OfFunctionGradient(Func<Vector<double>, double> fun
144144
/// For more options and diagnostics consider to use <see cref="BfgsMinimizer"/> directly.
145145
/// An alternative routine using conjugate gradients (CG) is available in <see cref="ConjugateGradientMinimizer"/>.
146146
/// </summary>
147-
public static Vector<double> OfFunctionGradient(Func<Vector<double>, Tuple<double, Vector<double>>> functionGradient, Vector<double> initialGuess, double gradientTolerance=1e-5, double parameterTolerance=1e-5, double functionProgressTolerance=1e-5, int maxIterations=1000)
147+
public static Vector<double> OfFunctionGradient(Func<Vector<double>, (double, Vector<double>)> functionGradient, Vector<double> initialGuess, double gradientTolerance=1e-5, double parameterTolerance=1e-5, double functionProgressTolerance=1e-5, int maxIterations=1000)
148148
{
149149
var objective = ObjectiveFunction.Gradient(functionGradient);
150150
var algorithm = new BfgsMinimizer(gradientTolerance, parameterTolerance, functionProgressTolerance, maxIterations);
@@ -168,7 +168,7 @@ public static Vector<double> OfFunctionGradientConstrained(Func<Vector<double>,
168168
/// Find vector x that minimizes the function f(x), constrained within bounds, using the Broyden–Fletcher–Goldfarb–Shanno Bounded (BFGS-B) algorithm.
169169
/// For more options and diagnostics consider to use <see cref="BfgsBMinimizer"/> directly.
170170
/// </summary>
171-
public static Vector<double> OfFunctionGradientConstrained(Func<Vector<double>, Tuple<double, Vector<double>>> functionGradient, Vector<double> lowerBound, Vector<double> upperBound, Vector<double> initialGuess, double gradientTolerance=1e-5, double parameterTolerance=1e-5, double functionProgressTolerance=1e-5, int maxIterations=1000)
171+
public static Vector<double> OfFunctionGradientConstrained(Func<Vector<double>, (double, Vector<double>)> functionGradient, Vector<double> lowerBound, Vector<double> upperBound, Vector<double> initialGuess, double gradientTolerance=1e-5, double parameterTolerance=1e-5, double functionProgressTolerance=1e-5, int maxIterations=1000)
172172
{
173173
var objective = ObjectiveFunction.Gradient(functionGradient);
174174
var algorithm = new BfgsBMinimizer(gradientTolerance, parameterTolerance, functionProgressTolerance, maxIterations);
@@ -191,7 +191,7 @@ public static Vector<double> OfFunctionGradientHessian(Func<Vector<double>, doub
191191
/// Find vector x that minimizes the function f(x) using the Newton algorithm.
192192
/// For more options and diagnostics consider to use <see cref="NewtonMinimizer"/> directly.
193193
/// </summary>
194-
public static Vector<double> OfFunctionGradientHessian(Func<Vector<double>, Tuple<double, Vector<double>, Matrix<double>>> functionGradientHessian, Vector<double> initialGuess, double gradientTolerance=1e-8, int maxIterations=1000)
194+
public static Vector<double> OfFunctionGradientHessian(Func<Vector<double>, (double, Vector<double>, Matrix<double>)> functionGradientHessian, Vector<double> initialGuess, double gradientTolerance=1e-8, int maxIterations=1000)
195195
{
196196
var objective = ObjectiveFunction.GradientHessian(functionGradientHessian);
197197
var result = NewtonMinimizer.Minimum(objective, initialGuess, gradientTolerance, maxIterations);

src/Numerics/FindRoots.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,26 +84,26 @@ public static double OfFunctionDerivative(Func<double, double> f, Func<double, d
8484
/// Find both complex roots of the quadratic equation c + b*x + a*x^2 = 0.
8585
/// Note the special coefficient order ascending by exponent (consistent with polynomials).
8686
/// </summary>
87-
public static Tuple<Complex, Complex> Quadratic(double c, double b, double a)
87+
public static (Complex, Complex) Quadratic(double c, double b, double a)
8888
{
8989
if (b == 0d)
9090
{
9191
var t = new Complex(-c/a, 0d).SquareRoot();
92-
return new Tuple<Complex, Complex>(t, -t);
92+
return (t, -t);
9393
}
9494

9595
var q = b > 0d
9696
? -0.5*(b + new Complex(b*b - 4*a*c, 0d).SquareRoot())
9797
: -0.5*(b - new Complex(b*b - 4*a*c, 0d).SquareRoot());
9898

99-
return new Tuple<Complex, Complex>(q/a, c/q);
99+
return (q/a, c/q);
100100
}
101101

102102
/// <summary>
103103
/// Find all three complex roots of the cubic equation d + c*x + b*x^2 + a*x^3 = 0.
104104
/// Note the special coefficient order ascending by exponent (consistent with polynomials).
105105
/// </summary>
106-
public static Tuple<Complex, Complex, Complex> Cubic(double d, double c, double b, double a)
106+
public static (Complex, Complex, Complex) Cubic(double d, double c, double b, double a)
107107
{
108108
return RootFinding.Cubic.Roots(d, c, b, a);
109109
}

0 commit comments

Comments
 (0)