Skip to content

Commit 200452b

Browse files
authored
Merge pull request #134 from USACE-RMC/workflow-and-test-stability
Workflow fixes and test stability improvements
2 parents 344473a + cf7dab8 commit 200452b

22 files changed

Lines changed: 69 additions & 51 deletions

File tree

.github/workflows/NuGetPublish.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77
jobs:
88
publish:
99
runs-on: windows-latest
10+
timeout-minutes: 60
1011
steps:
1112
- uses: actions/checkout@v4
1213
with:
@@ -27,9 +28,6 @@ jobs:
2728
- name: Build
2829
run: dotnet build Numerics/Numerics.csproj -c Release -p:Version=${{ steps.version.outputs.VERSION }}
2930

30-
- name: Test (all frameworks)
31-
run: dotnet test -c Release --no-build
32-
3331
- name: Pack
3432
run: dotnet pack Numerics/Numerics.csproj -c Release --no-build -p:Version=${{ steps.version.outputs.VERSION }}
3533

.github/workflows/Release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
build:
1010
uses: HydrologicEngineeringCenter/dotnet-workflows/.github/workflows/release.yml@main
1111
with:
12-
dotnet-version: '9.0.x'
12+
dotnet-version: '10.0.x'
1313
project-names: 'Numerics'
1414
run-tests: true
1515
nuget-source: 'https://www.hec.usace.army.mil/nexus/repository/consequences-nuget-public/'

.github/workflows/Snapshot.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ jobs:
88
build:
99
uses: HydrologicEngineeringCenter/dotnet-workflows/.github/workflows/snapshot.yml@main
1010
with:
11-
dotnet-version: '9.0.x'
11+
dotnet-version: '10.0.x'
1212
project-names: 'Numerics'
13-
version: '1.0.0'
13+
version: '2.0.0'
1414
run-tests: true
1515
nuget-source: 'https://www.hec.usace.army.mil/nexus/repository/consequences-nuget-public/'
1616
secrets:

Numerics/Distributions/Univariate/VonMises.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
using Numerics.Mathematics.Optimization;
3535
using Numerics.Mathematics.RootFinding;
3636
using Numerics.Mathematics.SpecialFunctions;
37+
using Numerics.Sampling;
3738

3839
namespace Numerics.Distributions
3940
{
@@ -439,7 +440,7 @@ public override double[] GenerateRandomValues(int sampleSize, int seed = -1)
439440
if (_parametersValid == false)
440441
ValidateParameters([Mu, Kappa], true);
441442

442-
var rng = seed < 0 ? new Random() : new Random(seed);
443+
var rng = seed < 0 ? new MersenneTwister() : new MersenneTwister(seed);
443444
var values = new double[sampleSize];
444445

445446
if (_kappa < 1e-10)

Numerics/Machine Learning/Supervised/KNearestNeighbors.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
using Numerics.Data.Statistics;
3232
using Numerics.Mathematics.LinearAlgebra;
33+
using Numerics.Sampling;
3334
using System;
3435
using System.Linq;
3536
using System.Threading.Tasks;
@@ -363,7 +364,7 @@ public KNearestNeighbors(Matrix x, Vector y, int k)
363364
/// <param name="seed">Optional. The prng seed. If negative or zero, then the computer clock is used as a seed.</param>
364365
private double[]? kNNBootstrapPredict(Matrix xTrain, Vector yTrain, Matrix xTest, int seed = -1)
365366
{
366-
var rnd = seed > 0 ? new Random(seed) : new Random();
367+
var rnd = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister();
367368
var idxs = rnd.NextIntegers(0, xTrain.NumberOfRows, xTrain.NumberOfRows);
368369
var bootX = new Matrix(xTrain.NumberOfRows, xTrain.NumberOfColumns);
369370
var bootY = new Vector(yTrain.Length);
@@ -393,7 +394,7 @@ public KNearestNeighbors(Matrix x, Vector y, int k)
393394
var output = new double[xTest.NumberOfRows, 4]; // lower, median, upper, mean
394395

395396
var bootResults = new double[xTest.NumberOfRows, realizations];
396-
var rnd = seed > 0 ? new Random(seed) : new Random();
397+
var rnd = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister();
397398
var seeds = rnd.NextIntegers(realizations);
398399

399400
// Bootstrap the predictions

Numerics/Mathematics/Integration/MonteCarloIntegration.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929
*/
3030

31+
using Numerics.Sampling;
3132
using System;
3233
using System.Collections.Generic;
3334
using System.Linq;
@@ -83,7 +84,7 @@ public MonteCarloIntegration(Func<double[], double> function, int dimensions, IL
8384
Dimensions = dimensions;
8485
Min = min.ToArray();
8586
Max = max.ToArray();
86-
Random = new Random();
87+
Random = new MersenneTwister();
8788
}
8889

8990
/// <summary>

Numerics/Mathematics/Optimization/Global/ShuffledComplexEvolution.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,9 @@ protected override void Optimize()
175175

176176
// Initialize shuffled complex evolution (SCE) algorithm
177177
// Create list of complex prngs
178-
var complexPRNGs = new List<Random>();
178+
var complexPRNGs = new List<MersenneTwister>();
179179
for (i = 0; i < Complexes; i++)
180-
complexPRNGs.Add(new Random(prng.Next()));
180+
complexPRNGs.Add(new MersenneTwister(prng.Next()));
181181

182182
// Create trapezoidal cumulative probability for points in complex
183183
var cdf = Trapezoidal(CCEIterations);
@@ -211,7 +211,7 @@ protected override void Optimize()
211211
}
212212

213213
// Rank the points in terms of fitness (i.e., order of increasing function value).
214-
Dpoints.Sort((x, y) => x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness));
214+
Dpoints.Sort((x, y) => { int c = x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness); return c != 0 ? c : x.Index.CompareTo(y.Index); });
215215

216216
// Next reset the indexes, so that i = 0 represents the point With the smallest function value.
217217
for (i = 0; i <= Dpoints.Count - 1; i++)
@@ -287,7 +287,7 @@ private void EvolveComplex(int alpha, ref List<PointFitness> Acomplex, double[]
287287
{
288288

289289
// Rank the B points in terms of fitness (i.e., order of increasing function value.
290-
B.Sort((x, y) => x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness));
290+
B.Sort((x, y) => { int c = x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness); return c != 0 ? c : x.Index.CompareTo(y.Index); });
291291

292292
// Find centroid g excluding worst point and compute reflection of worst point about centroid r = 2g - u(worst)
293293
Reflection(ref B, ref g, ref p);
@@ -350,7 +350,7 @@ private void EvolveComplex(int alpha, ref List<PointFitness> Acomplex, double[]
350350
}
351351
}
352352

353-
Acomplex.Sort((x, y) => x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness));
353+
Acomplex.Sort((x, y) => { int c = x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness); return c != 0 ? c : x.Index.CompareTo(y.Index); });
354354
}
355355
}
356356

Numerics/Sampling/MCMC/Base/MCMCSampler.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,7 @@ protected virtual ParameterSet[] InitializeChains()
402402
return chainStates;
403403
}
404404

405-
var prng = new Random(PRNGSeed);
405+
var prng = new MersenneTwister(PRNGSeed);
406406
var rnds = LatinHypercube.Random(InitialIterations, NumberOfParameters, prng.Next());
407407
var parameters = new double[NumberOfParameters];
408408
var tempPopulation = new List<ParameterSet>();
@@ -634,14 +634,14 @@ public void Reset()
634634
_simulations = 0;
635635
MAPInitializationFailed = false;
636636
// Clear old memory and re-instantiate the result storage
637-
_masterPRNG = new Random(PRNGSeed);
638-
_chainPRNGs = new Random[NumberOfChains];
637+
_masterPRNG = new MersenneTwister(PRNGSeed);
638+
_chainPRNGs = new MersenneTwister[NumberOfChains];
639639
PopulationMatrix = new List<ParameterSet>();
640640
MarkovChains = new List<ParameterSet>[NumberOfChains];
641641
Output = new List<ParameterSet>[NumberOfChains];
642642
for (int i = 0; i < NumberOfChains; i++)
643643
{
644-
_chainPRNGs[i] = new Random(_masterPRNG.Next());
644+
_chainPRNGs[i] = new MersenneTwister(_masterPRNG.Next());
645645
MarkovChains[i] = new List<ParameterSet>();
646646
Output[i] = new List<ParameterSet>();
647647
}

Numerics/Utilities/ExtensionMethods.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ public static T[] RandomSubset<T>(this T[] array, int length, int seed = -1, boo
337337
if (length > array.Length)
338338
throw new ArgumentException("The subset length must be less than or equal to the array length.");
339339

340-
Random random = seed > 0 ? new Random(seed) : new Random();
340+
var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister();
341341
var indexes = random.NextIntegers(0, array.Length, length, replace);
342342
var result = new T[indexes.Length];
343343
for (int i = 0; i < indexes.Length; i++)
@@ -484,7 +484,7 @@ public static void SetColumn<T>(this T[,] array, int index, T[] values)
484484
if (length > array.GetLength(0))
485485
throw new ArgumentException("The subset length must be less than or equal to the array length.");
486486

487-
Random random = seed > 0 ? new Random(seed) : new Random();
487+
var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister();
488488
var indexes = random.NextIntegers(0, array.GetLength(0), length, replace);
489489
var result = new T[indexes.Length, array.GetLength(1)];
490490
for (int i = 0; i < indexes.Length; i++)
@@ -561,7 +561,7 @@ public static Vector RandomSubset(this Vector vector, int length, int seed = -1,
561561
if (length > vector.Length)
562562
throw new ArgumentException("The subset length must be less than or equal to the vector length.");
563563

564-
Random random = seed > 0 ? new Random(seed) : new Random();
564+
var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister();
565565
var indexes = random.NextIntegers(0, vector.Length, length, replace);
566566
var result = new Vector(indexes.Length);
567567
for (int i = 0; i < indexes.Length; i++)
@@ -687,7 +687,7 @@ public static Matrix RandomSubset(this Matrix matrix, int length, int seed = -1,
687687
if (length > matrix.NumberOfRows)
688688
throw new ArgumentException("The subset length must be less than or equal to the number of rows in the matrix.");
689689

690-
Random random = seed > 0 ? new Random(seed) : new Random();
690+
var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister();
691691
var indexes = random.NextIntegers(0, matrix.NumberOfRows, length, replace);
692692
var result = new Matrix(indexes.Length, matrix.NumberOfColumns);
693693
for (int i = 0; i < indexes.Length; i++)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
using Microsoft.VisualStudio.TestTools.UnitTesting;
22

3-
[assembly: DoNotParallelize]
3+
[assembly: Parallelize(Scope = ExecutionScope.ClassLevel)]

0 commit comments

Comments
 (0)