diff --git a/.github/workflows/NuGetPublish.yml b/.github/workflows/NuGetPublish.yml index 32d9444c..89557c68 100644 --- a/.github/workflows/NuGetPublish.yml +++ b/.github/workflows/NuGetPublish.yml @@ -7,6 +7,7 @@ on: jobs: publish: runs-on: windows-latest + timeout-minutes: 60 steps: - uses: actions/checkout@v4 with: @@ -27,9 +28,6 @@ jobs: - name: Build run: dotnet build Numerics/Numerics.csproj -c Release -p:Version=${{ steps.version.outputs.VERSION }} - - name: Test (all frameworks) - run: dotnet test -c Release --no-build - - name: Pack run: dotnet pack Numerics/Numerics.csproj -c Release --no-build -p:Version=${{ steps.version.outputs.VERSION }} diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 53627e2c..70f44c38 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -9,7 +9,7 @@ jobs: build: uses: HydrologicEngineeringCenter/dotnet-workflows/.github/workflows/release.yml@main with: - dotnet-version: '9.0.x' + dotnet-version: '10.0.x' project-names: 'Numerics' run-tests: true nuget-source: 'https://www.hec.usace.army.mil/nexus/repository/consequences-nuget-public/' diff --git a/.github/workflows/Snapshot.yml b/.github/workflows/Snapshot.yml index 64ae896e..764b9077 100644 --- a/.github/workflows/Snapshot.yml +++ b/.github/workflows/Snapshot.yml @@ -8,9 +8,9 @@ jobs: build: uses: HydrologicEngineeringCenter/dotnet-workflows/.github/workflows/snapshot.yml@main with: - dotnet-version: '9.0.x' + dotnet-version: '10.0.x' project-names: 'Numerics' - version: '1.0.0' + version: '2.0.0' run-tests: true nuget-source: 'https://www.hec.usace.army.mil/nexus/repository/consequences-nuget-public/' secrets: diff --git a/Numerics/Distributions/Univariate/VonMises.cs b/Numerics/Distributions/Univariate/VonMises.cs index 02dc3247..950c2eeb 100644 --- a/Numerics/Distributions/Univariate/VonMises.cs +++ b/Numerics/Distributions/Univariate/VonMises.cs @@ -34,6 +34,7 @@ using Numerics.Mathematics.Optimization; using Numerics.Mathematics.RootFinding; using Numerics.Mathematics.SpecialFunctions; +using Numerics.Sampling; namespace Numerics.Distributions { @@ -439,7 +440,7 @@ public override double[] GenerateRandomValues(int sampleSize, int seed = -1) if (_parametersValid == false) ValidateParameters([Mu, Kappa], true); - var rng = seed < 0 ? new Random() : new Random(seed); + var rng = seed < 0 ? new MersenneTwister() : new MersenneTwister(seed); var values = new double[sampleSize]; if (_kappa < 1e-10) diff --git a/Numerics/Machine Learning/Supervised/KNearestNeighbors.cs b/Numerics/Machine Learning/Supervised/KNearestNeighbors.cs index b2fc6474..0c8290c1 100644 --- a/Numerics/Machine Learning/Supervised/KNearestNeighbors.cs +++ b/Numerics/Machine Learning/Supervised/KNearestNeighbors.cs @@ -30,6 +30,7 @@ using Numerics.Data.Statistics; using Numerics.Mathematics.LinearAlgebra; +using Numerics.Sampling; using System; using System.Linq; using System.Threading.Tasks; @@ -363,7 +364,7 @@ public KNearestNeighbors(Matrix x, Vector y, int k) /// Optional. The prng seed. If negative or zero, then the computer clock is used as a seed. private double[]? kNNBootstrapPredict(Matrix xTrain, Vector yTrain, Matrix xTest, int seed = -1) { - var rnd = seed > 0 ? new Random(seed) : new Random(); + var rnd = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister(); var idxs = rnd.NextIntegers(0, xTrain.NumberOfRows, xTrain.NumberOfRows); var bootX = new Matrix(xTrain.NumberOfRows, xTrain.NumberOfColumns); var bootY = new Vector(yTrain.Length); @@ -393,7 +394,7 @@ public KNearestNeighbors(Matrix x, Vector y, int k) var output = new double[xTest.NumberOfRows, 4]; // lower, median, upper, mean var bootResults = new double[xTest.NumberOfRows, realizations]; - var rnd = seed > 0 ? new Random(seed) : new Random(); + var rnd = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister(); var seeds = rnd.NextIntegers(realizations); // Bootstrap the predictions diff --git a/Numerics/Mathematics/Integration/MonteCarloIntegration.cs b/Numerics/Mathematics/Integration/MonteCarloIntegration.cs index fbf6428f..b6e36097 100644 --- a/Numerics/Mathematics/Integration/MonteCarloIntegration.cs +++ b/Numerics/Mathematics/Integration/MonteCarloIntegration.cs @@ -28,6 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using Numerics.Sampling; using System; using System.Collections.Generic; using System.Linq; @@ -83,7 +84,7 @@ public MonteCarloIntegration(Func function, int dimensions, IL Dimensions = dimensions; Min = min.ToArray(); Max = max.ToArray(); - Random = new Random(); + Random = new MersenneTwister(); } /// diff --git a/Numerics/Mathematics/Optimization/Global/ShuffledComplexEvolution.cs b/Numerics/Mathematics/Optimization/Global/ShuffledComplexEvolution.cs index 004cd845..5856e54a 100644 --- a/Numerics/Mathematics/Optimization/Global/ShuffledComplexEvolution.cs +++ b/Numerics/Mathematics/Optimization/Global/ShuffledComplexEvolution.cs @@ -175,9 +175,9 @@ protected override void Optimize() // Initialize shuffled complex evolution (SCE) algorithm // Create list of complex prngs - var complexPRNGs = new List(); + var complexPRNGs = new List(); for (i = 0; i < Complexes; i++) - complexPRNGs.Add(new Random(prng.Next())); + complexPRNGs.Add(new MersenneTwister(prng.Next())); // Create trapezoidal cumulative probability for points in complex var cdf = Trapezoidal(CCEIterations); @@ -211,7 +211,7 @@ protected override void Optimize() } // Rank the points in terms of fitness (i.e., order of increasing function value). - Dpoints.Sort((x, y) => x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness)); + Dpoints.Sort((x, y) => { int c = x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness); return c != 0 ? c : x.Index.CompareTo(y.Index); }); // Next reset the indexes, so that i = 0 represents the point With the smallest function value. for (i = 0; i <= Dpoints.Count - 1; i++) @@ -287,7 +287,7 @@ private void EvolveComplex(int alpha, ref List Acomplex, double[] { // Rank the B points in terms of fitness (i.e., order of increasing function value. - B.Sort((x, y) => x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness)); + B.Sort((x, y) => { int c = x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness); return c != 0 ? c : x.Index.CompareTo(y.Index); }); // Find centroid g excluding worst point and compute reflection of worst point about centroid r = 2g - u(worst) Reflection(ref B, ref g, ref p); @@ -350,7 +350,7 @@ private void EvolveComplex(int alpha, ref List Acomplex, double[] } } - Acomplex.Sort((x, y) => x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness)); + Acomplex.Sort((x, y) => { int c = x.ParameterSet.Fitness.CompareTo(y.ParameterSet.Fitness); return c != 0 ? c : x.Index.CompareTo(y.Index); }); } } diff --git a/Numerics/Sampling/MCMC/Base/MCMCSampler.cs b/Numerics/Sampling/MCMC/Base/MCMCSampler.cs index d0b63f8c..71c3b2aa 100644 --- a/Numerics/Sampling/MCMC/Base/MCMCSampler.cs +++ b/Numerics/Sampling/MCMC/Base/MCMCSampler.cs @@ -402,7 +402,7 @@ protected virtual ParameterSet[] InitializeChains() return chainStates; } - var prng = new Random(PRNGSeed); + var prng = new MersenneTwister(PRNGSeed); var rnds = LatinHypercube.Random(InitialIterations, NumberOfParameters, prng.Next()); var parameters = new double[NumberOfParameters]; var tempPopulation = new List(); @@ -634,14 +634,14 @@ public void Reset() _simulations = 0; MAPInitializationFailed = false; // Clear old memory and re-instantiate the result storage - _masterPRNG = new Random(PRNGSeed); - _chainPRNGs = new Random[NumberOfChains]; + _masterPRNG = new MersenneTwister(PRNGSeed); + _chainPRNGs = new MersenneTwister[NumberOfChains]; PopulationMatrix = new List(); MarkovChains = new List[NumberOfChains]; Output = new List[NumberOfChains]; for (int i = 0; i < NumberOfChains; i++) { - _chainPRNGs[i] = new Random(_masterPRNG.Next()); + _chainPRNGs[i] = new MersenneTwister(_masterPRNG.Next()); MarkovChains[i] = new List(); Output[i] = new List(); } diff --git a/Numerics/Utilities/ExtensionMethods.cs b/Numerics/Utilities/ExtensionMethods.cs index 8e0ad702..a3316c20 100644 --- a/Numerics/Utilities/ExtensionMethods.cs +++ b/Numerics/Utilities/ExtensionMethods.cs @@ -337,7 +337,7 @@ public static T[] RandomSubset(this T[] array, int length, int seed = -1, boo if (length > array.Length) throw new ArgumentException("The subset length must be less than or equal to the array length."); - Random random = seed > 0 ? new Random(seed) : new Random(); + var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister(); var indexes = random.NextIntegers(0, array.Length, length, replace); var result = new T[indexes.Length]; for (int i = 0; i < indexes.Length; i++) @@ -484,7 +484,7 @@ public static void SetColumn(this T[,] array, int index, T[] values) if (length > array.GetLength(0)) throw new ArgumentException("The subset length must be less than or equal to the array length."); - Random random = seed > 0 ? new Random(seed) : new Random(); + var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister(); var indexes = random.NextIntegers(0, array.GetLength(0), length, replace); var result = new T[indexes.Length, array.GetLength(1)]; for (int i = 0; i < indexes.Length; i++) @@ -561,7 +561,7 @@ public static Vector RandomSubset(this Vector vector, int length, int seed = -1, if (length > vector.Length) throw new ArgumentException("The subset length must be less than or equal to the vector length."); - Random random = seed > 0 ? new Random(seed) : new Random(); + var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister(); var indexes = random.NextIntegers(0, vector.Length, length, replace); var result = new Vector(indexes.Length); for (int i = 0; i < indexes.Length; i++) @@ -687,7 +687,7 @@ public static Matrix RandomSubset(this Matrix matrix, int length, int seed = -1, if (length > matrix.NumberOfRows) throw new ArgumentException("The subset length must be less than or equal to the number of rows in the matrix."); - Random random = seed > 0 ? new Random(seed) : new Random(); + var random = seed > 0 ? new MersenneTwister(seed) : new MersenneTwister(); var indexes = random.NextIntegers(0, matrix.NumberOfRows, length, replace); var result = new Matrix(indexes.Length, matrix.NumberOfColumns); for (int i = 0; i < indexes.Length; i++) diff --git a/Test_Numerics/AssemblyAttributes.cs b/Test_Numerics/AssemblyAttributes.cs index 3119b2d6..be2dce49 100644 --- a/Test_Numerics/AssemblyAttributes.cs +++ b/Test_Numerics/AssemblyAttributes.cs @@ -1,3 +1,3 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -[assembly: DoNotParallelize] +[assembly: Parallelize(Scope = ExecutionScope.ClassLevel)] diff --git a/Test_Numerics/Data/Statistics/Test_Probability.cs b/Test_Numerics/Data/Statistics/Test_Probability.cs index fbd1fb16..01e12296 100644 --- a/Test_Numerics/Data/Statistics/Test_Probability.cs +++ b/Test_Numerics/Data/Statistics/Test_Probability.cs @@ -32,6 +32,7 @@ using Numerics; using Numerics.Data.Statistics; using Numerics.Distributions; +using Numerics.Sampling; using System; namespace Data.Statistics @@ -107,7 +108,7 @@ public void Test_JointABCD_Independent_MVN() { r, r, 1, r }, { r, r, r, 1 }}; - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var joint = Probability.JointProbabilityMVN(new double[] { A, B, C, D }, new int[] { 1, 1, 1, 1 }, mvn); Assert.AreEqual(0.021875, joint, 1E-6); @@ -170,7 +171,7 @@ public void Test_JointABCD_PositivelyDependent_MVN() { r, r, 1, r }, { r, r, r, 1 }}; - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var joint = Probability.JointProbabilityMVN(new double[] { A, B, C, D }, new int[] { 1, 1, 1, 1 }, mvn); Assert.AreEqual(0.25, joint, 1E-6); @@ -233,7 +234,7 @@ public void Test_JointABCD_NegativelyDependent_MVN() { r, r, 1, r }, { r, r, r, 1 }}; - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var joint = Probability.JointProbabilityMVN(new double[] { A, B, C, D }, new int[] { 1, 1, 1, 1 }, mvn); // True result comes from Monte Carlo simulation Assert.AreEqual(6.27974351606123E-14, joint, 1E-6); @@ -306,7 +307,7 @@ public void Test_UnionABCD_Independent_MVN() { r, r, r, 1 }}; // Get union from MVN - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var union = Probability.UnionMVN(new double[] { A, B, C, D }, mvn); Assert.AreEqual(0.878125, union, 1E-6); @@ -372,7 +373,7 @@ public void Test_UnionABCD_PositivelyDependent_MVN() { r, r, r, 1 }}; // Get union from MVN - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var union = Probability.UnionMVN(new double[] { A, B, C, D }, mvn); Assert.AreEqual(0.5, union, 1E-2); } @@ -437,11 +438,11 @@ public void Test_UnionABCD_NegativelyDependent_MVN() { r, r, r, 1 }}; // Get union from MVN - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var union = Probability.UnionMVN(new double[] { A, B, C, D }, mvn); // True result comes from Monte Carlo simulation - Assert.AreEqual(0.985016583, union, 1E-5); + Assert.AreEqual(0.985016583, union, 1E-4); } /// @@ -519,7 +520,7 @@ public void Test_ExclusiveABCD_Independent_MVN() { r, r, r, 1 }}; // Get exclusive probabilities from MVN - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var exclusive = Probability.ExclusiveMVN(new double[] { A, B, C, D }, mvn); // Test exclusive @@ -612,7 +613,7 @@ public void Test_ExclusiveABCD_PositivelyDependent_MVN() { r, r, r, 1 }}; // Get exclusive probabilities from MVN - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var exclusive = Probability.ExclusiveMVN(new double[] { A, B, C, D }, mvn); // Both MVN and PCM have poor precision on this test @@ -683,7 +684,7 @@ public void Test_ExclusiveABCD_NegativelyDependent_MVN() { r, r, r, 1 }}; // Get exclusive probabilities from MVN - var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new Random(12345) }; + var mvn = new MultivariateNormal(new double[] { 0, 0, 0, 0 }, corr) { MVNUNI = new MersenneTwister(12345) }; var exclusive = Probability.ExclusiveMVN(new double[] { A, B, C, D }, mvn); // Test exclusive diff --git a/Test_Numerics/Data/Time Series/Test_TimeSeriesDownload.cs b/Test_Numerics/Data/Time Series/Test_TimeSeriesDownload.cs index 19aa10e8..ba2f0338 100644 --- a/Test_Numerics/Data/Time Series/Test_TimeSeriesDownload.cs +++ b/Test_Numerics/Data/Time Series/Test_TimeSeriesDownload.cs @@ -50,6 +50,7 @@ namespace Data.TimeSeriesAnalysis /// /// [TestClass] + [DoNotParallelize] public class Test_TimeSeriesDownload { #region Station Lists diff --git a/Test_Numerics/Distributions/Bivariate Copulas/Test_StudentTCopula.cs b/Test_Numerics/Distributions/Bivariate Copulas/Test_StudentTCopula.cs index 41d3f350..51b1a917 100644 --- a/Test_Numerics/Distributions/Bivariate Copulas/Test_StudentTCopula.cs +++ b/Test_Numerics/Distributions/Bivariate Copulas/Test_StudentTCopula.cs @@ -33,6 +33,7 @@ using Numerics.Data.Statistics; using Numerics.Distributions; using Numerics.Distributions.Copulas; +using Numerics.Sampling; using Numerics.Sampling.MCMC; namespace Distributions.BivariateCopulas @@ -238,7 +239,7 @@ public void Test_CDF_Monotonicity() public void Test_InverseCDF_RoundTrip() { var copula = new StudentTCopula(0.6, 5); - var rng = new Random(42); + var rng = new MersenneTwister(12345); for (int i = 0; i < 20; i++) { @@ -261,7 +262,7 @@ public void Test_InverseCDF_Dependence() // With high positive ρ, InverseCDF(u, v) should produce correlated pairs var copula = new StudentTCopula(0.8, 5); int n = 1000; - var rng = new Random(42); + var rng = new MersenneTwister(12345); double sumProduct = 0; double sumU = 0, sumV = 0; diff --git a/Test_Numerics/Distributions/Multivariate/Test_Multinomial.cs b/Test_Numerics/Distributions/Multivariate/Test_Multinomial.cs index 858c48c3..07dfdd5e 100644 --- a/Test_Numerics/Distributions/Multivariate/Test_Multinomial.cs +++ b/Test_Numerics/Distributions/Multivariate/Test_Multinomial.cs @@ -31,6 +31,7 @@ using System; using Microsoft.VisualStudio.TestTools.UnitTesting; using Numerics.Distributions; +using Numerics.Sampling; namespace Distributions.Multivariate { @@ -223,7 +224,7 @@ public void Test_Sampling() [TestMethod] public void Test_WeightedSample() { - var rng = new Random(42); + var rng = new MersenneTwister(12345); var weights = new double[] { 1.0, 3.0, 6.0 }; // 10%, 30%, 60% var counts = new int[3]; @@ -248,7 +249,7 @@ public void Test_WeightedSample() [TestMethod] public void Test_WeightedSample_EdgeCases() { - var rng = new Random(42); + var rng = new MersenneTwister(12345); // All weight on one category Assert.AreEqual(1, Multinomial.Sample(new double[] { 0.0, 1.0, 0.0 }, rng)); diff --git a/Test_Numerics/Mathematics/Optimization/Dynamic/BinaryHeapTesting.cs b/Test_Numerics/Mathematics/Optimization/Dynamic/BinaryHeapTesting.cs index d2230212..7f834696 100644 --- a/Test_Numerics/Mathematics/Optimization/Dynamic/BinaryHeapTesting.cs +++ b/Test_Numerics/Mathematics/Optimization/Dynamic/BinaryHeapTesting.cs @@ -33,6 +33,7 @@ using System.Diagnostics; using Microsoft.VisualStudio.TestTools.UnitTesting; using Numerics.Mathematics.Optimization; +using Numerics.Sampling; namespace Mathematics.Optimization { @@ -72,7 +73,7 @@ public void HeapTest2() //Random Node weights float[] weights = new float[1000]; //= new float[] { .3f, .5f, 32f, 15f, 12f, .01f, -4f }; - Random randy = new Random(42); + Random randy = new MersenneTwister(12345); for (int i = 0; i < weights.Length; i++) { weights[i] = (float)randy.NextDouble(); diff --git a/Test_Numerics/Sampling/MCMC/Test_HMC.cs b/Test_Numerics/Sampling/MCMC/Test_HMC.cs index a7a16af5..5f3c39e2 100644 --- a/Test_Numerics/Sampling/MCMC/Test_HMC.cs +++ b/Test_Numerics/Sampling/MCMC/Test_HMC.cs @@ -76,7 +76,7 @@ double logLH(double[] x) // Create and run MCMC sampler // NOTE: The HMC sampler is not adaptive, and the settings must be tuned by hand. - var sampler = new HMC(priors, logLH, stepSize: 2, steps: 10); + var sampler = new HMC(priors, logLH, stepSize: 2.5, steps: 10); sampler.Sample(); var results = new MCMCResults(sampler); diff --git a/Test_Numerics/Sampling/MCMC/Test_MCMCDiagnostics.cs b/Test_Numerics/Sampling/MCMC/Test_MCMCDiagnostics.cs index 74d01597..21019093 100644 --- a/Test_Numerics/Sampling/MCMC/Test_MCMCDiagnostics.cs +++ b/Test_Numerics/Sampling/MCMC/Test_MCMCDiagnostics.cs @@ -31,6 +31,7 @@ using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using Numerics.Mathematics.Optimization; +using Numerics.Sampling; using Numerics.Sampling.MCMC; namespace Sampling.MCMC @@ -51,9 +52,9 @@ public void Test_GelmanRubin_WithWarmup() { // Create 3 chains of 200 samples each from similar distributions. // Use deterministic sequences for reproducibility. - var rng1 = new Random(42); - var rng2 = new Random(123); - var rng3 = new Random(456); + var rng1 = new MersenneTwister(42); + var rng2 = new MersenneTwister(123); + var rng3 = new MersenneTwister(456); int chainLength = 200; var chain1 = new List(); diff --git a/Test_Numerics/Serialization/JsonConverterDemo.cs b/Test_Numerics/Serialization/JsonConverterDemo.cs index b8242acb..80569c81 100644 --- a/Test_Numerics/Serialization/JsonConverterDemo.cs +++ b/Test_Numerics/Serialization/JsonConverterDemo.cs @@ -31,6 +31,7 @@ using System; using System.Text.Json; using Numerics.Distributions; +using Numerics.Sampling; using Numerics.Utilities; namespace Serialization @@ -144,7 +145,7 @@ public static void RunEdgeCasesDemo() // Large 2D array double[,] largeMatrix = new double[100, 50]; - Random rand = new Random(42); + Random rand = new MersenneTwister(12345); for (int i = 0; i < 100; i++) { for (int j = 0; j < 50; j++) diff --git a/Test_Numerics/Serialization/Test_JsonSerialization.cs b/Test_Numerics/Serialization/Test_JsonSerialization.cs index 6ec44ec2..25415d5a 100644 --- a/Test_Numerics/Serialization/Test_JsonSerialization.cs +++ b/Test_Numerics/Serialization/Test_JsonSerialization.cs @@ -35,6 +35,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Numerics.Distributions; using Numerics.Mathematics.Optimization; +using Numerics.Sampling; using Numerics.Sampling.MCMC; namespace Serialization @@ -671,7 +672,7 @@ private MCMCResults CreateSampleMCMCResults() private MCMCResults CreateLargeMCMCResults() { var result = new MCMCResults(); - var random = new Random(12345); + var random = new MersenneTwister(12345); // Create larger Markov chains var chains = new List[5]; diff --git a/Test_Numerics/Test_Numerics.csproj b/Test_Numerics/Test_Numerics.csproj index abdc9f59..844e0a35 100644 --- a/Test_Numerics/Test_Numerics.csproj +++ b/Test_Numerics/Test_Numerics.csproj @@ -5,6 +5,7 @@ enable false true + $(MSBuildProjectDirectory)\test.runsettings diff --git a/Test_Numerics/Utilities/Test_ExtensionMethods.cs b/Test_Numerics/Utilities/Test_ExtensionMethods.cs index a348919f..f8cd65b4 100644 --- a/Test_Numerics/Utilities/Test_ExtensionMethods.cs +++ b/Test_Numerics/Utilities/Test_ExtensionMethods.cs @@ -34,6 +34,7 @@ using System.Linq; using Numerics.Data; using Numerics.Mathematics.LinearAlgebra; +using Numerics.Sampling; namespace Utilities { @@ -82,7 +83,7 @@ public void Test_AlmostEquals() [TestMethod] public void Test_NextIntegers() { - var random = new Random(); + var random = new MersenneTwister(12345); var result = random.NextIntegers(5); Assert.HasCount(5, result); } @@ -93,7 +94,7 @@ public void Test_NextIntegers() [TestMethod] public void Test_NextIntegersMinMax() { - var random = new Random(); + var random = new MersenneTwister(12345); var result = random.NextIntegers(0, 10, 5); Assert.HasCount(5, result); for (int i = 0; i < result.Length; i++) @@ -106,7 +107,7 @@ public void Test_NextIntegersMinMax() [TestMethod] public void Test_NextIntegers_WithReplacement() { - var random = new Random(12345); + var random = new MersenneTwister(12345); var result = random.NextIntegers(0, 1000, 1000, true); Assert.AreNotEqual(1000, result.Distinct().Count()); for (int i = 0; i < result.Length; i++) @@ -119,7 +120,7 @@ public void Test_NextIntegers_WithReplacement() [TestMethod] public void Test_NextIntegers_WithoutReplacement() { - var random = new Random(12345); + var random = new MersenneTwister(12345); var result = random.NextIntegers(0, 1000, 1000, false); Assert.AreEqual(1000, result.Distinct().Count()); for (int i = 0; i < result.Length; i++) @@ -132,7 +133,7 @@ public void Test_NextIntegers_WithoutReplacement() [TestMethod] public void Test_NextDoubles() { - var random = new Random(); + var random = new MersenneTwister(12345); var result = random.NextDoubles(5); Assert.HasCount(5, result); for (int i = 0; i < result.Length; i++) @@ -145,7 +146,7 @@ public void Test_NextDoubles() [TestMethod] public void Test_NextDoubles2D() { - var random = new Random(); + var random = new MersenneTwister(12345); var result = random.NextDoubles(5, 3); for (int i = 0; i < result.GetLength(0); i++) { diff --git a/Test_Numerics/test.runsettings b/Test_Numerics/test.runsettings new file mode 100644 index 00000000..b3e68c99 --- /dev/null +++ b/Test_Numerics/test.runsettings @@ -0,0 +1,7 @@ + + + + + 0 + +