Exemple #1
0
        public static int DiscreteUniform(int min, int max, bool cache)
        {
            if (min == max)
            {
                return(min);
            }
            Debug.Assert(min < max);
            DiscreteUniformDistribution uniform;
            Pair <int, int>             key = new Pair <int, int>(min, max);

            if (!discreteUniformGenerators.ContainsKey(key))
            {
                uniform = new DiscreteUniformDistribution(generator);
                // Beta must always be greater than Alpha, so we set them this way round
                AlphaAndBeta(uniform, min, max);
                if (cache)
                {
                    discreteUniformGenerators.Add(key, uniform);
                }
            }
            else
            {
                uniform = discreteUniformGenerators[key];
            }
            Debug.Assert(uniform != null);
            Debug.Assert(uniform.Alpha == min);
            Debug.Assert(uniform.Beta == max);
            int value = uniform.Next();

            Debug.Assert(value >= min && value <= max);
            return(value);
        }
        static MatrixValue Generate(Int32 n, Int32 m)
        {
            var distribution = new DiscreteUniformDistribution(Rng);
            var l            = n * m;
            var M            = new MatrixValue(n, m);
            var numbers      = new List <Int32>();

            distribution.Alpha = 0;

            for (var i = 1; i <= l; i++)
            {
                numbers.Add(i);
            }

            for (var j = 1; j <= n; j++)
            {
                for (var i = 1; i <= m; i++)
                {
                    distribution.Beta = numbers.Count - 1;
                    var index = distribution.Next();
                    index   = Math.Max(Math.Min(0, index), numbers.Count - 1);
                    M[j, i] = new ScalarValue(numbers[index]);
                    numbers.RemoveAt(index);
                }
            }

            return(M);
        }
Exemple #3
0
        public void DiscreteUniformDistribution()
        {
            Simulation.NumberOfSamples = 5;
            JsonSerializer serializer = JsonSerializer.Create(JsonSettings.SerializerSettings);

            string name = "My Distribution";

            var val = new DiscreteUniformDistribution(1, 5, 0)
            {
                Name = name
            };

            Guid guid = val.Guid;

            string json = JObject.FromObject(val, serializer).ToString();

            Simulation.ClearDistributionList();
            var newVal = JObject.Parse(json).ToObject <DiscreteUniformDistribution>(serializer);

            Assert.AreEqual(val.Guid, newVal.Guid);
            Assert.AreEqual(val.ConstrainedToInt, newVal.ConstrainedToInt);
            Assert.AreEqual(val.RandomSeed, newVal.RandomSeed);
            Assert.AreEqual(val.Min.ScalarValue, newVal.Min.ScalarValue);
            Assert.AreEqual(val.Minimum, newVal.Minimum);
            Assert.AreEqual(val.Max.ScalarValue, 5);
            Assert.AreEqual(val.Maximum, 5);
            Assert.AreEqual(val.Mean, 3.4);
            Assert.AreEqual(val.Name, name);
        }
Exemple #4
0
        public void ImplicitOperatorExceptions()
        {
            bool exceptionCaught = false;

            try
            {
                QrtValue val = null;
            }
            catch (ArgumentNullException)
            {
                exceptionCaught = true;
            }

            //Assert.IsTrue(exceptionCaught);

            exceptionCaught = false;

            try
            {
                QrtValue val = new DiscreteUniformDistribution(1.0, 5.0);
            }
            catch (ArgumentException)
            {
                exceptionCaught = true;
            }

            Assert.IsTrue(exceptionCaught);
        }
        public void DiscreteUniformDistribution_Result()
        {
            Simulation.NumberOfSamples = ExpectedResults.NumberOfSamples;
            //var duhh = ExpectedResults.GetDistributionObject<BernoulliDistribution>();

            var testInfo     = ExpectedResults.Data["DistributionResults"]["DiscreteUniformDistribution"];
            var inputs       = testInfo["ConstructorInputs"];
            var resultsArray = testInfo["Results"]
                               .Select(jv => (double)jv).ToArray();

            DiscreteUniformDistribution distr = new DiscreteUniformDistribution(
                inputs["min"].Value <int>(),
                inputs["max"].Value <int>(),
                inputs["randomSeed"].Value <int>());

            Vector <double> expectedResults = Vector <double> .Build.DenseOfArray(resultsArray);

            Assert.AreEqual(expectedResults, distr.GetResult());

            distr = new DiscreteUniformDistribution(1, 200);
            Assert.AreEqual(distr.Min.ScalarValue, 1);
            Assert.AreEqual(distr.Max.ScalarValue, 200);

            distr = new DiscreteUniformDistribution();
            Assert.AreEqual(distr.Min.ScalarValue, 0);
            Assert.AreEqual(distr.Max.ScalarValue, 0);
        }
        public void NaiveBayesConstructorTest4()
        {
            int classes    = 2;
            int inputCount = 3;

            double[] priors = { 0.4, 0.6 };
            DiscreteUniformDistribution initial = new DiscreteUniformDistribution(0, 3);

            var target = new NaiveBayes <DiscreteUniformDistribution>(classes, inputCount, initial, priors);

            Assert.AreEqual(classes, target.ClassCount);
            Assert.AreEqual(inputCount, target.InputCount);
            Assert.AreEqual(priors.Length, target.Priors.Length);
            Assert.AreEqual(0.4, target.Priors[0]);
            Assert.AreEqual(0.6, target.Priors[1]);

            Assert.AreEqual(2, target.Distributions.GetLength(0));
            Assert.AreEqual(3, target.Distributions.GetLength(1));

            for (int i = 0; i < classes; i++)
            {
                for (int j = 0; j < inputCount; j++)
                {
                    Assert.AreNotSame(initial, target.Distributions[i, j]);
                    Assert.AreEqual(0, target.Distributions[i, j].Minimum);
                    Assert.AreEqual(3, target.Distributions[i, j].Maximum);
                }
            }
        }
Exemple #7
0
        public void DistributionQrtValue()
        {
            Simulation.NumberOfSamples = 5;
            JsonSerializer serializer = JsonSerializer.Create(JsonSettings.SerializerSettings);

            string name = "My Distribution";

            var distr = new DiscreteUniformDistribution(1, 5, 0)
            {
                Name = name
            };

            QrtValue qrtValue = distr;

            string distrJson = JObject.FromObject(distr, serializer).ToString();
            string qrtJson   = JObject.FromObject(qrtValue, serializer).ToString();

            Simulation.ClearDistributionList();

            var newDistr    = JObject.Parse(distrJson).ToObject <DiscreteUniformDistribution>(serializer);
            var newQrtValue = JObject.Parse(qrtJson).ToObject <QrtValue>(serializer);

            Assert.AreEqual(distr.Guid, newQrtValue.DistributionValue.Guid);
            Assert.AreEqual(distr.ConstrainedToInt, newQrtValue.DistributionValue.ConstrainedToInt);
            Assert.AreEqual(distr.Minimum, newQrtValue.Minimum);
            Assert.AreEqual(distr.Maximum, newQrtValue.Maximum);

            Assert.AreEqual(distr.ConstrainedToInt, newQrtValue.ConstrainedToInt);
            Assert.IsTrue(newQrtValue.IsDistribution);
        }
Exemple #8
0
        // A routine to work around the mis-feature in setting alpha and beta
        private static void AlphaAndBeta(DiscreteUniformDistribution distribution, int alpha, int beta)
        {
            distribution.Alpha = Math.Min(alpha, distribution.Alpha);
            distribution.Beta  = Math.Max(beta, distribution.Beta);

            distribution.Alpha = alpha;
            distribution.Beta  = beta;
            Debug.Assert(distribution.Alpha == alpha);
            Debug.Assert(distribution.Beta == beta);
        }
Exemple #9
0
        public void ImplicitOperatorDistributionInteger()
        {
            Simulation.NumberOfSamples = ExpectedResults.NumberOfSamples;

            DiscreteUniformDistribution distr = new DiscreteUniformDistribution(1, 1000);

            QrtValue qrtVal = distr;

            Assert.IsTrue(qrtVal.IsDistribution);
            Assert.IsTrue(qrtVal.ConstrainedToInt);
            Assert.AreEqual(qrtVal.ScalarValue, 0);
            Assert.AreEqual(qrtVal.DistributionValue.GetResult(), distr.GetResult());
        }
Exemple #10
0
        static Rng()
        {
            // Create a commonly-used and quicly locatable zeroOrOne distribution,
            // and also reference it in the discreteUniformGeneratirs dictionary
            zeroOrOne = new DiscreteUniformDistribution(generator);
            AlphaAndBeta(zeroOrOne, 0, 1);
            discreteUniformGenerators.Add(new Pair <int, int>(0, 1), zeroOrOne);

            // Create a commonly-used and quickly locatable zeroToOne distribution,
            // and also reference it in the continuousUniformGenerators dictionary
            zeroToOne = new ContinuousUniformDistribution(generator);
            AlphaAndBeta(zeroToOne, 0.0, 1.0);
            continuousUniformGenerators.Add(new Pair <double, double>(0.0, 1.0), zeroToOne);
        }
        public ValueType Sample()
        {
            var uniformDistribution = new DiscreteUniformDistribution(100); //[0, maxValue)
            var randValue           = uniformDistribution.Sample(rand) + 1;

            if (randValue >= 0 && randValue <= _accumulateOutcome1)
            {
                return(EventEnum.ScaningSmallAmountItems);
            }
            else if (randValue > _accumulateOutcome1 && randValue <= _accumulateOutcome2)
            {
                return(EventEnum.ScaningMediumAmountItems);
            }
            return(EventEnum.ScaningLargeAmountItems);
        }
Exemple #12
0
        public Form1()
        {
            InitializeComponent();

            //--
            mTranslations   = new Dictionary <string, Translations>();
            mPlainListWords = new PlainWords();

            //--
            mBinominalDistr  = new BinomialDistribution();
            mTriangleDistr   = new TriangularDistribution();
            mUniformDistr    = new DiscreteUniformDistribution();
            mContUniformDist = new ContinuousUniformDistribution();
            mRnd             = new Random();

            mStopTimer = false;
        }
Exemple #13
0
 public void TestDiscreteUniformDistribution()
 {
     double[][] para =
     {
         new double[] { 1, 11, 5, 0.4545454545454545454545455, 0.09090909090909090909090909 }
     };
     for (int i = 0; i < para.Length; i++)
     {
         var tester = new DiscDistTester(para[i], delegate(double a, double b)
         {
             var ret = new DiscreteUniformDistribution((int)a, (int)b);
             return(ret);
         }
                                         );
         tester.Test(1E-14);
     }
 }
Exemple #14
0
        public static Chromosome Cross(Tuple <Chromosome, Chromosome> pair, Random random)
        {
            IList <double>              values;
            UniformDistribution         uniform  = new UniformDistribution(Interval.FromEndpoints(0, 1));
            DiscreteUniformDistribution discrete = new DiscreteUniformDistribution(0, 1);
            double randomNumber = uniform.GetRandomValue(random);

            if (randomNumber <= SELECTION_1_PROBABILITY) // whole arithmetic recombination
            {
                values = pair.Item1.Values.Zip(pair.Item2.Values, (x, y) => (x + y) / 2).ToList();
            }
            else if (randomNumber <= SELECTION_1_PROBABILITY + SELECTION_2_PROBABILITY) // discrete recombination
            {
                values = pair.Item1.Values.Zip(pair.Item2.Values, (x, y) => discrete.GetRandomValue(random) == 0 ? x : y).ToList();
            }
            else // simple arithmetic recombination
            {
                values = pair.Item1.Values.Zip(pair.Item2.Values, (x, y) => pair.Item1.Values.IndexOf(x) < pair.Item1.Values.Count / 2 ? x : (x + y) / 2).ToList();
            }
            return(new Chromosome(values));
        }
        public static Tuple <Chromosome, Chromosome> Select(IList <Chromosome> population, Random random, out Chromosome worst)
        {
            SortedSet <Chromosome>      tournament = new SortedSet <Chromosome>();
            DiscreteUniformDistribution discrete   = new DiscreteUniformDistribution(0, population.Count - 1);

            while (tournament.Count < K)
            {
                int index = discrete.GetRandomValue(random);
                tournament.Add(population[index]);
            }
            worst = tournament.Max;
            tournament.Remove(worst);
            double sumFitness;

            CalculateFitness(tournament, out sumFitness);
            Chromosome parent1 = SelectParent(tournament, sumFitness, random);

            tournament.Remove(parent1);
            CalculateFitness(tournament, out sumFitness);
            Chromosome parent2 = SelectParent(tournament, sumFitness, random);

            return(new Tuple <Chromosome, Chromosome>(parent1, parent2));
        }
    /// <summary>
    /// Sets the distribution for operations using the current genrator
    /// </summary>
    /// <param name="distx">Distx.</param>
    public void setDistribution(distributions distx, Dictionary <string, double> args)
    {
        //TODO check arguments to ensure they are making a change to the distribution
        //otherwise throw an exception see laplace as a example of implementing this
        switch (distx)
        {
        case distributions.Bernoili:
            BernoulliDistribution x0 = new BernoulliDistribution(gen);
            if (args.ContainsKey("alpha"))
            {
                x0.Alpha = args["alpha"];
            }
            else
            {
                throw new System.Exception("for Bernoili distribution you must provide an alpha");
            }
            dist = x0;
            break;

        case distributions.Beta:
            BetaDistribution x1 = new BetaDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x1.Alpha = args["alpha"];
                x1.Beta  = args["beta"];
            }
            else
            {
                throw new System.Exception(" for beta distribution you must provide alpha and beta");
            }
            dist = x1;
            break;

        case distributions.BetaPrime:
            BetaPrimeDistribution x2 = new BetaPrimeDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x2.Alpha = args["alpha"];
                x2.Beta  = args["beta"];
            }
            else
            {
                throw new System.Exception(" for betaPrime distribution you must provide alpha and beta");
            }
            dist = x2;
            break;

        case distributions.Cauchy:
            CauchyDistribution x3 = new CauchyDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("gamma"))
            {
                x3.Alpha = args["alpha"];
                x3.Gamma = args["gamma"];
            }
            else
            {
                throw new System.Exception("for cauchy dist you must provide alpha and gamma");
            }
            dist = x3;
            break;

        case distributions.Chi:
            ChiDistribution x4 = new ChiDistribution(gen);
            if (args.ContainsKey("alpha"))
            {
                x4.Alpha = (int)args["alpha"];
            }
            else
            {
                throw new System.Exception("for chi you must provide alpha");
            }
            dist = x4;
            break;

        case distributions.ChiSquared:
            ChiSquareDistribution x5 = new ChiSquareDistribution(gen);
            if (args.ContainsKey("alpha"))
            {
                x5.Alpha = (int)args["alpha"];
            }
            else
            {
                throw new System.Exception("for chiSquared you must provide alpha");
            }
            dist = x5;
            break;

        case distributions.ContinuousUniform:
            ContinuousUniformDistribution x6 = new ContinuousUniformDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x6.Alpha = args["alpha"];
                x6.Beta  = args["beta"];
            }
            else
            {
                throw new System.Exception("for ContinuousUniform you must provide alpha and beta");
            }
            dist = x6;
            break;

        case distributions.DiscreteUniform:
            DiscreteUniformDistribution x7 = new DiscreteUniformDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x7.Alpha = (int)args["alpha"];
                x7.Beta  = (int)args["beta"];
            }
            else
            {
                throw new System.Exception("for discrete uniform distribution you must provide alpha and beta");
            }
            dist = x7;
            break;

        case distributions.Erlang:
            ErlangDistribution x8 = new ErlangDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("lambda"))
            {
                x8.Alpha  = (int)args["alpha"];
                x8.Lambda = (int)args["lambda"];
            }
            else
            {
                throw new System.Exception("for Erlang dist you must provide alpha and lambda");
            }
            dist = x8;
            break;

        case distributions.Exponential:
            ExponentialDistribution x9 = new ExponentialDistribution(gen);
            if (args.ContainsKey("lambda"))
            {
                x9.Lambda = args["lambda"];
            }
            else
            {
                throw new System.Exception("for exponential dist you must provide lambda");
            }
            dist = x9;
            break;

        case distributions.FisherSnedecor:
            FisherSnedecorDistribution x10 = new FisherSnedecorDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x10.Alpha = (int)args["alpha"];
                x10.Beta  = (int)args["beta"];
            }
            else
            {
                throw new System.Exception("for FisherSnedecor you must provide alpha and beta");
            }
            dist = x10;
            break;

        case distributions.FisherTippett:
            FisherTippettDistribution x11 = new FisherTippettDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("mu"))
            {
                x11.Alpha = args["alpha"];
                x11.Mu    = args["mu"];
            }
            else
            {
                throw new System.Exception("for FisherTippets you must provide alpha and mu");
            }
            dist = x11;
            break;

        case distributions.Gamma:
            GammaDistribution x12 = new GammaDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("theta"))
            {
                x12.Alpha = args["alpha"];
                x12.Theta = args["theta"];
            }
            else
            {
                throw new System.Exception("for Gamma dist you must provide alpha and theta");
            }
            dist = x12;
            break;

        case distributions.Geometric:
            GeometricDistribution x13 = new GeometricDistribution(gen);
            if (args.ContainsKey("alpha"))
            {
                x13.Alpha = args["alpha"];
            }
            else
            {
                throw new System.Exception("Geometric distribution requires alpha value");
            }
            dist = x13;
            break;

        case distributions.Binomial:
            BinomialDistribution x14 = new BinomialDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x14.Alpha = args["alpha"];
                x14.Beta  = (int)args["beta"];
            }
            else
            {
                throw new System.Exception("binomial distribution requires alpha and beta");
            }
            dist = x14;
            break;

        case distributions.None:
            break;

        case distributions.Laplace:
            LaplaceDistribution x15 = new LaplaceDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("mu"))
            {
                if (x15.IsValidAlpha(args["alpha"]) && x15.IsValidMu(args["mu"]))
                {
                    x15.Alpha = args["alpha"];
                    x15.Mu    = args["mu"];
                }
                else
                {
                    throw new ArgumentException("alpha must be greater than zero");
                }
            }
            else
            {
                throw new System.Exception("Laplace dist requires alpha and mu");
            }
            dist = x15;
            break;

        case distributions.LogNormal:
            LognormalDistribution x16 = new LognormalDistribution(gen);
            if (args.ContainsKey("mu") && args.ContainsKey("sigma"))
            {
                x16.Mu    = args["mu"];
                x16.Sigma = args["sigma"];
            }
            else
            {
                throw new System.Exception("lognormal distribution requires mu and sigma");
            }
            dist = x16;
            break;

        case distributions.Normal:
            NormalDistribution x17 = new NormalDistribution(gen);
            if (args.ContainsKey("mu") && args.ContainsKey("sigma"))
            {
                x17.Mu    = args["mu"];
                x17.Sigma = args["sigma"];
            }
            else
            {
                throw new System.Exception("normal distribution requires mu and sigma");
            }
            dist = x17;
            break;

        case distributions.Pareto:
            ParetoDistribution x18 = new ParetoDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x18.Alpha = args["alpha"];
                x18.Beta  = args["beta"];
            }
            else
            {
                throw new System.Exception("pareto distribution requires alpha and beta");
            }
            dist = x18;
            break;

        case distributions.Poisson:
            PoissonDistribution x19 = new PoissonDistribution(gen);
            if (args.ContainsKey("lambda"))
            {
                x19.Lambda = args["lambda"];
            }
            else
            {
                throw new System.Exception("Poisson distribution requires lambda");
            }
            dist = x19;
            break;

        case distributions.Power:
            PowerDistribution x20 = new PowerDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta"))
            {
                x20.Alpha = args["alpha"];
                x20.Beta  = args["beta"];
            }
            else
            {
                throw new System.Exception("Power dist requires alpha and beta");
            }
            dist = x20;
            break;

        case distributions.RayLeigh:
            RayleighDistribution x21 = new RayleighDistribution(gen);
            if (args.ContainsKey("sigma"))
            {
                x21.Sigma = args["sigma"];
            }
            else
            {
                throw new System.Exception("Rayleigh dist requires sigma");
            }
            dist = x21;
            break;

        case distributions.StudentsT:
            StudentsTDistribution x22 = new StudentsTDistribution(gen);
            if (args.ContainsKey("nu"))
            {
                x22.Nu = (int)args["nu"];
            }
            else
            {
                throw new System.Exception("StudentsT dist requirres nu");
            }
            dist = x22;
            break;

        case distributions.Triangular:
            TriangularDistribution x23 = new TriangularDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("beta") && args.ContainsKey("gamma"))
            {
                x23.Alpha = args["alpha"];
                x23.Beta  = args["beta"];
                x23.Gamma = args["gamma"];
            }
            else
            {
                throw new System.Exception("Triangular distribution requires alpha, beta and gamma");
            }
            dist = x23;
            break;

        case distributions.WeiBull:
            WeibullDistribution x24 = new WeibullDistribution(gen);
            if (args.ContainsKey("alpha") && args.ContainsKey("lambda"))
            {
                x24.Alpha  = args["alpha"];
                x24.Lambda = args["lambda"];
            }
            else
            {
                throw new System.Exception("WeiBull dist requires alpha and lambda");
            }
            dist = x24;
            break;

        default:
            throw new NotImplementedException("the distribution you want has not yet been implemented " +
                                              "you could help everyone out by going and implementing it");
        }
    }
        public MatrixValue Function(MatrixValue cfgs, ScalarValue n, FunctionValue f, ArgumentsValue P)
        {
            var numberOfBootstrapSamples = n.GetIntegerOrThrowException("n", Name);
            var nConfigs = cfgs.DimensionY;
            var nData = cfgs.DimensionX;
            var distribution = new DiscreteUniformDistribution(Rng)
            {
                Beta = nConfigs,
                Alpha = 1
            };

            if (numberOfBootstrapSamples <= 1)
                throw new YAMPException("Bootstrap: The number of bootstrap samples n is smaller or equal to 1!");

            var parameters = new ArgumentsValue(cfgs);

            foreach (var m in P.Values)
            {
                parameters.Insert(m);
            }

            var temp = f.Perform(Context, parameters);
            var nResult = 0;//dimension of the result

            if (temp is ScalarValue)
            {
                nResult = 1;
            }
            else if (temp is MatrixValue)
            {
                nResult = ((MatrixValue)temp).Length;
            }
            else
            {
                throw new YAMPException("Bootstrap: The observable f has to return either a scalar or a matrix!");
            }

            var BootstrapObservable = new MatrixValue(numberOfBootstrapSamples, nResult);

            for (var i = 1; i <= numberOfBootstrapSamples; i++)
            {
                var BootstrapConfigs = new MatrixValue(nConfigs, nData);

                for (var j = 1; j <= nConfigs; j++)
                {
                    var idx = distribution.Next();

                    for (var k = 1; k <= nData; k++)
                    {
                        BootstrapConfigs[j, k] = cfgs[idx, k];
                    }
                }

                parameters = new ArgumentsValue(BootstrapConfigs);

                foreach (var m in P.Values)
                {
                    parameters.Insert(m);
                }

                temp = f.Perform(Context, parameters);

                if (temp is ScalarValue)
                {
                    BootstrapObservable[i] = (ScalarValue)temp;
                }
                else
                {
                    var m = (MatrixValue)temp;

                    for (var k = 1; k <= nResult; k++)
                    {
                        BootstrapObservable[i, k] = m[k];
                    }
                }
            }

            temp = YMath.Average(BootstrapObservable);

            for (var i = 1; i <= numberOfBootstrapSamples; i++)
            {
                if (temp is ScalarValue)
                {
                    BootstrapObservable[i] -= temp as ScalarValue;
                    BootstrapObservable[i] *= BootstrapObservable[i];
                }
                else
                {
                    var T = temp as MatrixValue;

                    for (var k = 1; k <= nResult; k++)
                    {
                        BootstrapObservable[i, k] -= T[k];
                        BootstrapObservable[i, k] *= BootstrapObservable[i, k];
                    }
                }
            }

            var error = YMath.Average(BootstrapObservable);
            var sqrt = new SqrtFunction();
            error = sqrt.Perform(error);
            var result = new MatrixValue(2, nResult);

            if (temp is ScalarValue)
            {
                result[1] = (ScalarValue)temp;
                result[2] = (ScalarValue)error;
            }
            else
            {
                var T = (MatrixValue)temp;
                var E = (MatrixValue)error;

                for (var k = 1; k <= nResult; k++)
                {
                    result[1, k] = T[k];
                    result[2, k] = E[k];
                }
            }

            return result;
        }
Exemple #18
0
        /// <summary>
        /// Constructor que recibe los parámetros de inicialización del ambiente
        /// </summary>
        /// <param name="rows"> Número de filas </param>
        /// <param name="cols"> Número de columnas </param>
        /// <param name="t"> Número de turnos que transcurren entre un cambio del ambiente y el próximo </param>
        /// <param name="dirtPercent"> Porciento de celdas sucias </param>
        /// <param name="obstaclePercent"> Porciento de obstáculos </param>
        /// <param name="childrenCount"> Número de niños </param>
        public Environment(int rows, int cols, int t, double dirtPercent, double obstaclePercent, int childrenCount, Type robotType)
        {
            randomDirt = new DiscreteUniformDistribution(0, 6);
            randomMov  = new DiscreteUniformDistribution(0, 3);
            randomGrid = new DiscreteUniformDistribution(0, 7);

            //Si dirtPercent >= 60% generar una excepción porque el ambiente inicial no sería factible
            if (dirtPercent >= dirtTop)
            {
                throw new Exception("Los parámetros de inicialización no permiten crear un ambiente factible.");
            }

            Dimensions = new Point(rows, cols);
            //Crear las cuadrículas del ambiente
            cells = new Cell[rows, cols];
            for (var i = 0; i < rows; i++)
            {
                for (var j = 0; j < cols; j++)
                {
                    cells[i, j] = new Cell(new Point(i, j));
                }
            }

            randomXPos = new DiscreteUniformDistribution(0, rows - 1);
            randomYPos = new DiscreteUniformDistribution(0, cols - 1);

            TurnsToChange = t;
            envChanges    = 1;

            ChildrenCount = childrenCount;
            //Crear el corral
            CreatePlaypen();

            ObstaclePercent = obstaclePercent;
            //Calcular el número de obstáculos a partir del %. Se escoge el entero <= que el valor
            obstacleCount = (int)Math.Floor(obstaclePercent * (Length - playpen.Length) / 100);

            //Calcular el número de casillas vacías
            EmptyCount = Length - obstacleCount - playpen.Length;

            //Guardar el % inicial de suciedad por si se necesita para las estadísticas
            initialDirtPercent = dirtPercent;

            //Calcular el número de casillas sucias a partir del % y el número de casillas vacías.
            //Se escoge el entero <= que el valor
            initialDirtCount = (int)Math.Floor(dirtPercent * EmptyCount / 100);
            int cleanCount = EmptyCount - initialDirtCount;

            //La cantidad de casillas limpias debe permitir ubicar a los niños y poder hacer al menos un movimiento
            if (cleanCount - childrenCount <= 0)
            {
                throw new Exception("Los parámetros de inicialización no permiten crear un ambiente factible.");
            }

            //Generar los obstáculos
            GenerateInitialObstacles(obstacleCount);

            //Generar la suciedad inicial a partir del parámetro
            GenerateInitialDirt(initialDirtCount);
            DirtCount  = initialDirtCount;
            CleanCount = 0;

            //Generar posiciones aleatorias para los niños
            CreateChildren();

            var ctor  = robotType.GetConstructor(new[] { typeof(Environment) });
            var robot = (HomeRobot)ctor.Invoke(new[] { this });

            //Generar aleatoriamente la posición del robot en una casilla vacía dentro de los límites del ambiente\
            SetRobot(robot);
        }
 public virtual void Reset(Point pos)
 {
     randomMov   = new DiscreteUniformDistribution(0, 4);
     CurrentPos  = pos;
     PreviousPos = new Point();
 }
        public MatrixValue Function(MatrixValue cfgs, ScalarValue n, FunctionValue f, ArgumentsValue P)
        {
            var numberOfBootstrapSamples = n.GetIntegerOrThrowException("n", Name);
            var nConfigs     = cfgs.DimensionY;
            var nData        = cfgs.DimensionX;
            var distribution = new DiscreteUniformDistribution(Rng)
            {
                Beta  = nConfigs,
                Alpha = 1
            };

            if (numberOfBootstrapSamples <= 1)
            {
                throw new YAMPException("Bootstrap: The number of bootstrap samples n is smaller or equal to 1!");
            }

            var parameters = new ArgumentsValue(cfgs);

            foreach (var m in P.Values)
            {
                parameters.Insert(m);
            }

            var temp    = f.Perform(Context, parameters);
            var nResult = 0;//dimension of the result

            if (temp is ScalarValue)
            {
                nResult = 1;
            }
            else if (temp is MatrixValue)
            {
                nResult = ((MatrixValue)temp).Length;
            }
            else
            {
                throw new YAMPException("Bootstrap: The observable f has to return either a scalar or a matrix!");
            }

            var BootstrapObservable = new MatrixValue(numberOfBootstrapSamples, nResult);

            for (var i = 1; i <= numberOfBootstrapSamples; i++)
            {
                var BootstrapConfigs = new MatrixValue(nConfigs, nData);

                for (var j = 1; j <= nConfigs; j++)
                {
                    var idx = distribution.Next();

                    for (var k = 1; k <= nData; k++)
                    {
                        BootstrapConfigs[j, k] = cfgs[idx, k];
                    }
                }

                parameters = new ArgumentsValue(BootstrapConfigs);

                foreach (var m in P.Values)
                {
                    parameters.Insert(m);
                }

                temp = f.Perform(Context, parameters);

                if (temp is ScalarValue)
                {
                    BootstrapObservable[i] = (ScalarValue)temp;
                }
                else
                {
                    var m = (MatrixValue)temp;

                    for (var k = 1; k <= nResult; k++)
                    {
                        BootstrapObservable[i, k] = m[k];
                    }
                }
            }

            temp = YMath.Average(BootstrapObservable);

            for (var i = 1; i <= numberOfBootstrapSamples; i++)
            {
                if (temp is ScalarValue)
                {
                    BootstrapObservable[i] -= temp as ScalarValue;
                    BootstrapObservable[i] *= BootstrapObservable[i];
                }
                else
                {
                    var T = temp as MatrixValue;

                    for (var k = 1; k <= nResult; k++)
                    {
                        BootstrapObservable[i, k] -= T[k];
                        BootstrapObservable[i, k] *= BootstrapObservable[i, k];
                    }
                }
            }

            var error = YMath.Average(BootstrapObservable);
            var sqrt  = new SqrtFunction();

            error = sqrt.Perform(error);
            var result = new MatrixValue(2, nResult);

            if (temp is ScalarValue)
            {
                result[1] = (ScalarValue)temp;
                result[2] = (ScalarValue)error;
            }
            else
            {
                var T = (MatrixValue)temp;
                var E = (MatrixValue)error;

                for (var k = 1; k <= nResult; k++)
                {
                    result[1, k] = T[k];
                    result[2, k] = E[k];
                }
            }

            return(result);
        }