예제 #1
0
        public static DataTable TestData()
        {
            DataTable results = new DataTable();

            results.Columns.Add(new DataColumn("R", typeof(double)));
            results.Columns.Add(new DataColumn("Vorg", typeof(double)));
            results.Columns.Add(new DataColumn("Vmath", typeof(double)));
            results.Columns.Add(new DataColumn("Vmc", typeof(double)));
            results.Columns.Add(new DataColumn("Vgum", typeof(double)));

            Optimizations.UseAnalyticalConvolution = false;
            Optimizations.UseFftConvolution        = false;

            int    experiments = 10;
            int    samples     = 1000;
            int    randoms     = (int)10e2;
            int    testType    = 5;
            double m1          = 0;
            double m2          = 0; //для тестов 6, 7 - положение левой границы

            for (int i = 0; i < experiments; i++)
            {
                double s1 = 1;
                double s2 = s1 * InterpolateLiner(0.1, 10, i, experiments);

                var pair = GetData(testType, m1, m2, s1, s2, out double vOriginal, out double gum, out string formula);

                DistributionsEvaluator evaluator = new DistributionsEvaluator(formula);
                Dictionary <string, BaseDistribution> keyValuePairs = new Dictionary <string, BaseDistribution>();
                keyValuePairs.Add("A", pair[0].GetDistribution(samples));
                keyValuePairs.Add("B", pair[1].GetDistribution(samples));
                BaseDistribution resultMath = evaluator.EvaluateDistributions(keyValuePairs, new List <CorrelatedPair>());

                List <double> monteCarloQ = new List <double>();

                for (int j = 0; j < 10; j++)
                {
                    var resultMonteCarlo = new MonteCarloDistribution(formula, new Dictionary <string, DistributionSettings> {
                        { "A", pair[0] }, { "B", pair[1] }
                    }, randoms, 100);
                    monteCarloQ.Add(resultMonteCarlo.Variance);
                }

                double monteCarloQresult = Math.Sqrt(monteCarloQ.Sum(x => Math.Pow(x - vOriginal, 2)) / (monteCarloQ.Count - 1)) * 1.96;

                results.Rows.Add(s2 / s1, vOriginal, resultMath.Variance, vOriginal + monteCarloQresult, gum);
            }

            return(results);
        }
        private static BasicDistributionData GenerateBasicData(DistributionsEvaluator evaluator, Dictionary <string, DistributionSettings> univariateDistributions, Dictionary <string[], MultivariateDistributionSettings> multivariateDistributions, int samples, int pockets)
        {
            if (evaluator == null)
            {
                throw new ArgumentNullException(nameof(evaluator));
            }

            if (univariateDistributions == null)
            {
                throw new ArgumentNullException(nameof(univariateDistributions));
            }

            if (samples < 3)
            {
                throw new DistributionsArgumentException(DistributionsArgumentExceptionType.NumberOfExperimentsMustBeGreaterThenTwo);
            }

            if (pockets < 3)
            {
                throw new DistributionsArgumentException(DistributionsArgumentExceptionType.NumberOfPocketsMustBeGreaterThenTwo);
            }

            BasicDistributionData data = new BasicDistributionData();

            double[] random;

            if (multivariateDistributions == null)
            {
                random = GenerateRandom(evaluator, univariateDistributions, samples);
            }
            else
            {
                random = GenerateRandom(evaluator, univariateDistributions, multivariateDistributions, samples);
            }

            Array.Sort(random);

            double[] xAxis = CommonRandomMath.GenerateXAxis(random[0], random[samples - 1], pockets, out _);

            double[] cdf = GenerateCDF(xAxis, random);

            data.RandomSorted = random;
            data.XAxis        = xAxis;
            data.CDF          = cdf;
            data.PDF          = Derivate(cdf, xAxis[pockets - 1] - xAxis[0]);

            return(data);
        }
        private static double[] GenerateRandom(DistributionsEvaluator evaluator, Dictionary <string, DistributionSettings> univariateDistributions, Dictionary <string[], MultivariateDistributionSettings> multivariateDistributions, int samples)
        {
            double[] random = new double[samples];
            var      order  = evaluator.Parameters;

            MultivariateGenerator generator = new MultivariateGenerator(order, univariateDistributions, multivariateDistributions);

            Parallel.For(0, samples, i =>
            {
                Random rnd = Rnd.Value;

                double[] args = generator.Generate(rnd);

                random[i] = evaluator.EvaluateCompiled(args);
            });

            return(random);
        }
        private static double[] GenerateRandom(DistributionsEvaluator evaluator, Dictionary <string, DistributionSettings> randomSource, int samples)
        {
            double[] random = new double[samples];
            var      order  = evaluator.Parameters;

            int argsCount = order.Length;

            UnivariateContinuousDistribution[] orderedDistributions = new UnivariateContinuousDistribution[argsCount];

            ThreadLocal <double[]> argsLocal = new ThreadLocal <double[]>(() => new double[argsCount]);

            for (int i = 0; i < argsCount; i++)
            {
                string arg = order[i];

                if (randomSource.TryGetValue(arg, out DistributionSettings value))
                {
                    orderedDistributions[i] = value.GetUnivariateContinuoisDistribution();
                }
                else
                {
                    // TODO: check this out
                    // throw new DistributionsArgumentException($"Parameter value \"{arg}\" is missing", $"Отсутствует значение параметра \"{arg}\"");
                    throw new DistributionsArgumentException(DistributionsArgumentExceptionType.ParameterValueIsMissing, arg);
                }
            }

            Parallel.For(0, samples, i =>
            {
                double[] args = argsLocal.Value;
                Random rnd    = Rnd.Value;

                for (int j = 0; j < argsCount; j++)
                {
                    args[j] = orderedDistributions[j].Generate(rnd);
                }

                random[i] = evaluator.EvaluateCompiled(args);
            });

            return(random);
        }