Exemple #1
0
        public void CalculateProposedTauTest7()
        {
            Model      model;
            MethodInfo calculateProposedTauMethod;
            MethodInfo resetModelStateMethod;
            var        solver = DefaultSetupForCalculateProposedTauTests(out model, out calculateProposedTauMethod, out resetModelStateMethod);

            object[] inputArray1 = new object[1];

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            resetModelStateMethod.Invoke(solver, null);
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            model.Species[0].Count = 3;
            model.Species[1].Count = 3;
            inputArray1[0]         = 10;
            ReflectionUtility.SetHiddenField("nc", solver, 10);

            var tauOut7 = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.023677467222359326, tauOut7);

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            inputArray1[0] = 0.001;

            var tauOut7B = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.001, tauOut7B);
        }
Exemple #2
0
        public void CalculateProposedTauTest5()
        {
            Model      model;
            MethodInfo calculateProposedTauMethod;
            MethodInfo resetModelStateMethod;
            var        solver = DefaultSetupForCalculateProposedTauTests(out model, out calculateProposedTauMethod, out resetModelStateMethod);

            object[] inputArray1 = new object[1];
            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            //resetModelStateMethod.Invoke(solver, null);
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            model.Species[0].Count = 200;
            model.Species[1].Count = 10;
            ReflectionUtility.SetHiddenField("epsilon", solver, 0.1);
            inputArray1[0] = 10;

            var tauOut5 = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.052564102564102565, tauOut5);

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            inputArray1[0] = 0.01;
            var tauOut5B = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.01, tauOut5B);
        }
        public TransportSSA(ModelInfo modelInfo, float duration, int repeats, int samples)
            : base(modelInfo, duration, repeats, samples)
        {
            Configuration config = Configuration.CurrentConfiguration;

            // Transport events
            diffusionReactions = model.Reactions.Where(r => !r.IsLocal).ToList();

            // Reaction events
            reactionReactions = model.Reactions.Where(r => r.IsLocal).ToList();

            currentReactionRates = new float[reactionReactions.Count];
            kernels        = new float[model.Species.Count][];                                // jagged array (i.e. array of arrays)
            speciesIndices = new int[model.Species.Count][];                                  // nearest neighbors of the current species
            lambda         = new int[model.Species.Count];                                    // X(t+tau) = X(t) + lambda, diffusion changes
            diffusionRates = new float[diffusionReactions.Count];
            _partiallyExecutedReactionsEvents = new List <int>();

            // Jagged array initialization
            for (int iSpecies = 0; iSpecies < model.Species.Count; ++iSpecies)
            {
                int numberOfNieghbors = NumberOfNeighbors(iSpecies) + 1;       // +1 for the current node + number of neighbors
                kernels[iSpecies]        = new float[numberOfNieghbors];
                speciesIndices[iSpecies] = new int[numberOfNieghbors];
            }

            epsilon = config.GetParameterWithDefault("tssa.epsilon", 0.01f);
            greensFunctionIterations = config.GetParameterWithDefault("tssa.greensFunctionIterations", 100);
            verbose = config.GetParameterWithDefault("tssa.verbose", false);

            _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);

            // Get the transport rates
            FindDiffusionRates(ref diffusionRates);
        }
        // ReSharper restore InconsistentNaming

        // The algorithm presented here (specifically in regards to the critical
        // versus noncritical reactions to avoid negative species) can be found in
        // 'Avoiding Negative Populations in Explicit Poisson Tau-Leaping'
        // Cao, Gillespie, Petzold.  Journal of Chemical Physics.

        public TauLeaping(ModelInfo modelInfo, float duration, int repeats, int samples, ModelBuilder modelBuilder = null)
            : base(modelInfo, duration, repeats, samples, modelBuilder)
        {
            Configuration config = Configuration.CurrentConfiguration;

            _currentRates   = new float[model.Reactions.Count];
            _jacobianMatrix = new float[model.Reactions.Count, model.Species.Count];

            _nonCriticalReactions = new List <Reaction>();
            _criticalReactions    = new List <Reaction>();

            // We'll need at most reactions.Count values in one or the other array
            _criticalRates    = new float[model.Reactions.Count];
            _noncriticalRates = new float[model.Reactions.Count];

            epsilon  = config.GetParameterWithDefault("tau-leaping.epsilon", 0.001f);
            nc       = config.GetParameterWithDefault("tau-leaping.Nc", 2);
            multiple = config.GetParameterWithDefault("tau-leaping.Multiple", 10);
            SSAruns  = config.GetParameterWithDefault("tau-leaping.SSARuns", 100);

            CheckParameters();

            _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);

            Console.WriteLine("epsilon =  {0}", epsilon);
            Console.WriteLine("nc =       {0}", nc);
            Console.WriteLine("multiple = {0}", multiple);
            Console.WriteLine("SSA runs = {0}", SSAruns);
        }
Exemple #5
0
        public void CalculateProposedTauTest1()
        {
            Model      model;
            MethodInfo calculateProposedTauMethod;
            MethodInfo resetModelStateMethod;
            var        solver = DefaultSetupForCalculateProposedTauTests(out model, out calculateProposedTauMethod, out resetModelStateMethod);

            ReflectionUtility.SetHiddenField("_regime", solver, 0);
            double tauIn = 5;

            object[] inputArray1 = new object[1];
            inputArray1[0] = tauIn;

            var tauOut1 = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.017758100416769496, tauOut1);

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));

            inputArray1[0] = 0.0001;
            var tauOut1B = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(inputArray1[0], tauOut1B);
        }
Exemple #6
0
        public ExitTimes(ModelInfo modelInfo, double duration, int repeats, int samples)
            : base(modelInfo, duration, repeats, samples, new ModelBuilder())
        {
            currentRates     = new double[model.Reactions.Count];
            lambda           = new List <double>();
            lambdaLists      = new List <List <double> >();
            exitTimes        = new List <double>();
            numberOfGammaRNs = 0.0;

            _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);

            Configuration config = Configuration.CurrentConfiguration;

            _epsilon          = Math.Min(config.GetParameterWithDefault("et.epsilon", 0.5), 1.0);
            _eventName        = config.GetParameterWithDefault("et.eventName", "exitTimeEvent");
            _verbose          = config.GetParameterWithDefault("et.verbose", false);
            _testing          = config.GetParameterWithDefault("et.testing", false);
            _convergenceTest  = config.GetParameterWithDefault("et.convergence", false);
            _efficiencyCutoff = config.GetParameterWithDefault("et.efficiencyCutoff", 0.2);

            targetCondition = model.Predicates.First(s => s.Name == _eventName);

            sampleNumber  = 1;
            eventAchieved = false;

            if (_verbose)
            {
                Console.WriteLine("\n predicate: {0} with initial evaluation: {1} \n", targetCondition.Name, targetCondition.Value);
                Console.WriteLine("\n epsilon = {0} \n", _epsilon);
            }
        }
Exemple #7
0
 public BLeaping(ModelInfo modelInfo, double duration, int repeats, int samples)
     : base(modelInfo, duration, repeats, samples)
 {
     _currentRates        = new double[model.Reactions.Count];
     _tau                 = Configuration.CurrentConfiguration.GetParameterWithDefault("b-leaping.Tau", 0.1);
     _step                = 1;
     _deltaTau            = 0.0;
     _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);
 }
Exemple #8
0
        public Normal(float mean, float variance)
        {
            if (variance <= 0.0f)
            {
                throw new ArgumentException("Variance must be greater than 0.");
            }

            _mean     = mean;
            _variance = variance;

            _distributionSampler = RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG());
        }
Exemple #9
0
        public RLeaping(ModelInfo modelInfo, float duration, int repeats, int samples)
            : base(modelInfo, duration, repeats, samples)
        {
            Configuration config = Configuration.CurrentConfiguration;

            reactions              = new List <Reaction>(model.Reactions);
            currentRates           = new float[reactions.Count];
            jacobianMatrix         = new float[reactions.Count, model.Species.Count];
            _probabilityVector     = new float[reactions.Count];
            _executionsPerReaction = new int[reactions.Count];

            _epsilon         = config.GetParameterWithDefault("r-leaping.epsilon", 0.1f);
            _theta           = config.GetParameterWithDefault("r-leaping.theta", 0.0f);
            _sortingInterval = config.GetParameterWithDefault("r-leaping.sorting interval", 365.0f);
            _verbose         = config.GetParameterWithDefault("r-leaping.verbose", false);

            _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);
        }
Exemple #10
0
        public MidPoint(ModelInfo modelInfo, float duration, int repeats, int samples)
            : base(modelInfo, duration, repeats, samples, new MpModelBuilder())
        {
            Configuration config = Configuration.CurrentConfiguration;

            _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);

            epsilon  = config.GetParameterWithDefault("midpoint.epsilon", 0.01f);
            nc       = config.GetParameterWithDefault("midpoint.Nc", 2);
            multiple = config.GetParameterWithDefault("midpoint.Multiple", 10);
            SSAruns  = config.GetParameterWithDefault("midpoint.SSARuns", 100);

            CheckParameters();

            Console.WriteLine("epsilon =  {0}", epsilon);
            Console.WriteLine("nc =       {0}", nc);
            Console.WriteLine("multiple = {0}", multiple);
            Console.WriteLine("SSA runs = {0}", SSAruns);
        }
Exemple #11
0
        public RLeapingFast(ModelInfo modelInfo, double duration, int repeats, int samples)
            : base(modelInfo, duration, repeats, samples)
        {
            Configuration config = Configuration.CurrentConfiguration;

            reactions    = new List <Reaction>(model.Reactions);
            currentRates = new double[reactions.Count];

            _highestOrderReaction = new int[model.Species.Count];
            _muHat     = new double[model.Species.Count];
            _sigmaHat2 = new double[model.Species.Count];
            _varHat    = new double[model.Species.Count];

            _probabilityVector     = new double[reactions.Count];
            _executionsPerReaction = new int[reactions.Count];

            _epsilon         = config.GetParameterWithDefault("r-leaping.epsilon", 0.1);
            _sortingInterval = config.GetParameterWithDefault("r-leaping.sorting interval", 365.0);
            _verbose         = config.GetParameterWithDefault("r-leaping.verbose", false);

            _distributionSampler = RandLibSampler.CreateRandLibSampler(rng);
        }
Exemple #12
0
        public void CalculateProposedTauTest4()
        {
            Model      model;
            MethodInfo calculateProposedTauMethod;
            MethodInfo resetModelStateMethod;
            var        solver = DefaultSetupForCalculateProposedTauTests(out model, out calculateProposedTauMethod, out resetModelStateMethod);

            ReflectionUtility.SetHiddenField("_regime", solver, 0);
            object[] inputArray1 = new object[1];

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            //resetModelStateMethod.Invoke(solver, null);
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            model.Species[0].Count = 3;
            model.Species[1].Count = 2;
            inputArray1[0]         = 10;
            ReflectionUtility.SetHiddenField("nc", solver, 3);

            var tauOut4 = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.026637150625154243, tauOut4);

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            inputArray1[0] = 0.001;
            var tauOut4B = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.001, tauOut4B);

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_regime", solver, 3);
            inputArray1[0] = 6.29010763;
            var tauOut4C = calculateProposedTauMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(0.13335417718069428, tauOut4C);
        }
Exemple #13
0
        public FractionalDiffusion(ModelInfo modelInfo, float duration, int repeats, int samples)
            : base(modelInfo, duration, repeats, samples, new ModelBuilder())
        {
            Configuration config = Configuration.CurrentConfiguration;

            #region initializeFields
            _reactions                     = new List <Reaction>(model.Reactions);
            _alpha                         = config.GetParameterWithDefault("fd.alpha", 0.5f);
            _verbose                       = config.GetParameterWithDefault("fd.verbose", false);
            _Dalpha                        = config.GetParameterWithDefault("fd.Dalpha", 1.0f);
            _constant                      = config.GetParameterWithDefault("fd.constant", 0.25f);
            _h                             = config.GetParameterWithDefault("fd.h", 1.0f);
            _truncationDistance            = config.GetParameterWithDefault("fd.truncation", (int)Math.Round(((double)(modelInfo.Locales.Count() - 1)) / 4.0));
            _fourierNumber                 = 0.5;
            _n                             = modelInfo.Locales.Count() - 1;
            _currentRates                  = new float[_reactions.Count];
            _field                         = new int[_n];
            _numberOfNonDiscretizedSpecies = modelInfo.Species.Count() / _n;
            _tau                           = (float)TimeStep(_fourierNumber, _constant, _h, _alpha, _Dalpha);
            _dispersalChanges              = new int[model.Species.Count];
            _executionsPerReaction         = new int[model.Reactions.Count];
            _distributionSampler           = RandLibSampler.CreateRandLibSampler(rng);
            #endregion

            if (_verbose == true)
            {
                Console.WriteLine("number of locales = {0}", modelInfo.Locales.Count() - 1);
                Console.WriteLine("number of species = {0}", _numberOfNonDiscretizedSpecies);
                Console.WriteLine("truncation = {0}", _truncationDistance);
                Console.WriteLine("alpha = {0}", _alpha);
                Console.WriteLine("D_alpha = {0}", _Dalpha);
                Console.WriteLine("Fouier number (1d) = {0}", _fourierNumber);
                Console.WriteLine("h = {0}", _h);
                Console.WriteLine("C = {0}", _constant);
                Console.WriteLine("fractional diffusion tau = {0}", _tau);
            }
        }
Exemple #14
0
        public void LargeFactorialTest()
        {
            long fact = RandLibSampler.Factorial(20);

            Assert.AreEqual(2432902008176640000, fact);
        }
Exemple #15
0
        public void SmallFactorialTest()
        {
            long fact = RandLibSampler.Factorial(10);

            Assert.AreEqual(2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10, fact);
        }
Exemple #16
0
        private DistributionSampler GetAesCounterSampler()
        {
            DistributionSampler sampler = RandLibSampler.CreateRandLibSampler(AesCounterVariateGenerator.CreateAesCounterVariateGenerator(new uint[] { 20130110, 19680201 }));

            return(sampler);
        }
Exemple #17
0
        public void FireNonCriticalReactionsTest()
        {
            const string configString = @"{""solver"":""Tau"",""prng_seed"":123, ""prng_index"":1,""RNG"":{""type"":""PSEUDODES""}}";

            Configuration.CurrentConfiguration = Configuration.ConfigurationFromString(configString);

            ModelInfo    modelInfo = EmodlLoader.LoadEMODLFile("resources\\testmodelMidPoint.emodl");
            const double duration  = 6.28318531;
            const int    repeats   = 42;
            const int    samples   = 100;
            var          solver    = new TauLeaping(modelInfo, duration, repeats, samples);

            //Inputs for the method
            // Tau Step
            double tau1 = 0.0;
            var    tau2 = (1.0 / 200.0);

            //Need a list of reactions
            var currentRates        = new double[1];
            var nonCriticalReaction = new List <Reaction>();

            //Find Hidden Method to in order to initialize the population of each of the species
            MethodInfo resetModelStateMethod = ReflectionUtility.GetHiddenMethod("ResetModelState", solver);

            resetModelStateMethod.Invoke(solver, null);

            MethodInfo updateAndSumRatesMethod = ReflectionUtility.GetHiddenMethod("UpdateAndSumRates", solver);

            //Find the model object
            var model = ReflectionUtility.GetHiddenField <Model>("model", solver);

            currentRates[0] = model.Reactions[0].Rate;
            nonCriticalReaction.Add(model.Reactions[0]);

            object[] inputArray1 = new object[3];
            inputArray1[0] = tau1; inputArray1[1] = nonCriticalReaction; inputArray1[2] = currentRates;

            object[] inputArray2 = new object[3];
            inputArray2[0] = tau2; inputArray2[1] = nonCriticalReaction; inputArray2[2] = currentRates;

            //Find Hidden Method.
            MethodInfo fireNonCriticalReactionsMethod = ReflectionUtility.GetHiddenMethod("FireNonCriticalReactions", solver);

            // First Test if Tau = 0;
            fireNonCriticalReactionsMethod.Invoke(solver, inputArray1);

            Assert.AreEqual(400, model.Species[0].Value);
            Assert.AreEqual(200, model.Species[1].Value);
            Assert.AreEqual(900, model.Species[2].Value);

            //Second Test if Tau = = 0.05.  Set the RNG to a known seed number, in order to exactly know what is generated

            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            fireNonCriticalReactionsMethod.Invoke(solver, inputArray2);

            Assert.AreEqual(384.0, model.Species[0].Value);
            Assert.AreEqual(184.0, model.Species[1].Value);
            Assert.AreEqual(916.0, model.Species[2].Value);

            resetModelStateMethod.Invoke(solver, null);
            object[] inputArray3 = new object[2];
            inputArray3[0] = model.Reactions; inputArray3[1] = currentRates;
            updateAndSumRatesMethod.Invoke(solver, inputArray3);
            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            fireNonCriticalReactionsMethod.Invoke(solver, inputArray2);

            Assert.AreEqual(384.0, model.Species[0].Value);
            Assert.AreEqual(184.0, model.Species[1].Value);
            Assert.AreEqual(916.0, model.Species[2].Value);
        }
Exemple #18
0
        public void ExecuteReactionsTest()
        {
            //0.  Setup
            const string configString = @"{""solver"":""Tau"",""prng_seed"":123, ""prng_index"":1,""RNG"":{""type"":""PSEUDODES""}}";

            Configuration.CurrentConfiguration = Configuration.ConfigurationFromString(configString);

            ModelInfo    modelInfo = EmodlLoader.LoadEMODLFile("resources//testmodelTau.emodl");
            const double duration  = 6.28318531;
            const int    repeats   = 42;
            const int    samples   = 100;
            var          solver    = new TauLeaping(modelInfo, duration, repeats, samples);

            //Find Hidden Method to in order to initialize the population of each of the species
            MethodInfo resetModelStateMethod = ReflectionUtility.GetHiddenMethod("ResetModelState", solver);

            resetModelStateMethod.Invoke(solver, null);

            //Find the model object
            var model = ReflectionUtility.GetHiddenField <Model>("model", solver);

            //Find the method
            MethodInfo executeReactionsMethod = ReflectionUtility.GetHiddenMethod("ExecuteReactions", solver);

            //1.  ==Regime.SSA
            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_regime", solver, 0);
            ReflectionUtility.GetHiddenField <Reaction>("_ssaReaction", solver);
            //a. _ssaReaction == null;

            executeReactionsMethod.Invoke(solver, null);

            var regime = ReflectionUtility.GetHiddenField <int>("_regime", solver);

            Assert.AreEqual(0, regime);

            //b. _ssaReaction != null;
            ReflectionUtility.SetHiddenField("_remainingSSAsteps", solver, 1);
            ReflectionUtility.SetHiddenField("_ssaReaction", solver, model.Reactions[0]);
            ReflectionUtility.RunResetRngFactory();
            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));

            executeReactionsMethod.Invoke(solver, null);
            regime = ReflectionUtility.GetHiddenField <int>("_regime", solver);
            Assert.AreEqual(3, regime);
            Assert.AreEqual(6.0, model.Species[0].Count);
            Assert.AreEqual(1.0, model.Species[1].Count);

            //2.  == Regime.NonCritical

            ReflectionUtility.SetHiddenField("_regime", solver, 1);

            ReflectionUtility.RunResetRngFactory();
            resetModelStateMethod.Invoke(solver, null);
            model.Species[0].Count = 100;
            model.Species[1].Count = 50;
            var nonCriticalReactionsList = new List <Reaction>();

            nonCriticalReactionsList.Add(model.Reactions[0]);
            nonCriticalReactionsList.Add(model.Reactions[1]);
            var nonCriticalRates = new double[2];

            nonCriticalRates[0] = model.Reactions[0].Rate;
            nonCriticalRates[1] = model.Reactions[1].Rate;

            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_leapTau", solver, 0.01);
            ReflectionUtility.SetHiddenField("_nonCriticalReactions", solver, nonCriticalReactionsList);
            ReflectionUtility.SetHiddenField("_noncriticalRates", solver, nonCriticalRates);

            executeReactionsMethod.Invoke(solver, null);

            regime = ReflectionUtility.GetHiddenField <int>("_regime", solver);
            Assert.AreEqual(3, regime);
            Assert.AreEqual(103, model.Species[0].Count);
            Assert.AreEqual(47, model.Species[1].Count);

            //3.  == Regime.Critical ) no noncriticalreactions
            ReflectionUtility.SetHiddenField("_regime", solver, 2);

            ReflectionUtility.RunResetRngFactory();
            resetModelStateMethod.Invoke(solver, null);
            model.Species[0].Count = 100;
            model.Species[1].Count = 50;
            var criticalReactionsList = new List <Reaction>();

            criticalReactionsList.Add(model.Reactions[0]);
            criticalReactionsList.Add(model.Reactions[1]);
            var criticalRates = new double[2];

            criticalRates[0] = model.Reactions[0].Rate;
            criticalRates[1] = model.Reactions[1].Rate;

            MethodInfo updateAndSumRatesMethod = ReflectionUtility.GetHiddenMethod("UpdateAndSumRates", solver);

            object[] inputArray1 = new object[2];
            inputArray1[0] = criticalReactionsList; inputArray1[1] = criticalRates;

            var a0Critical = updateAndSumRatesMethod.Invoke(solver, inputArray1);

            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_a0Critical", solver, a0Critical);
            ReflectionUtility.SetHiddenField("_criticalReactions", solver, criticalReactionsList);
            ReflectionUtility.SetHiddenField("_criticalRates", solver, criticalRates);
            ReflectionUtility.SetHiddenField("_nonCriticalReactions", solver, null);
            ReflectionUtility.SetHiddenField("_noncriticalRates", solver, null);

            executeReactionsMethod.Invoke(solver, null);

            regime = ReflectionUtility.GetHiddenField <int>("_regime", solver);
            Assert.AreEqual(3, regime);
            Assert.AreEqual(101, model.Species[0].Count);
            Assert.AreEqual(49, model.Species[1].Count);

            //3.  == Regime.Critical b) noncriticalreactions and critical reactions
            ReflectionUtility.SetHiddenField("_regime", solver, 2);

            ReflectionUtility.RunResetRngFactory();
            resetModelStateMethod.Invoke(solver, null);
            model.Species[0].Count   = 100;
            model.Species[1].Count   = 50;
            criticalReactionsList    = new List <Reaction>();
            nonCriticalReactionsList = new List <Reaction>();
            criticalReactionsList.Add(model.Reactions[0]);
            nonCriticalReactionsList.Add(model.Reactions[1]);
            criticalRates       = new double[1];
            nonCriticalRates    = new double[1];
            criticalRates[0]    = model.Reactions[0].Rate;
            nonCriticalRates[0] = model.Reactions[1].Rate;

            inputArray1[0] = criticalReactionsList; inputArray1[1] = criticalRates;

            a0Critical = updateAndSumRatesMethod.Invoke(solver, inputArray1);

            ReflectionUtility.SetHiddenField("_distributionSampler", solver, RandLibSampler.CreateRandLibSampler(RNGFactory.GetRNG()));
            ReflectionUtility.SetHiddenField("_a0Critical", solver, a0Critical);
            ReflectionUtility.SetHiddenField("_leapTau", solver, 0.01);
            ReflectionUtility.SetHiddenField("_criticalReactions", solver, criticalReactionsList);
            ReflectionUtility.SetHiddenField("_criticalRates", solver, criticalRates);
            ReflectionUtility.SetHiddenField("_nonCriticalReactions", solver, nonCriticalReactionsList);
            ReflectionUtility.SetHiddenField("_noncriticalRates", solver, nonCriticalRates);

            executeReactionsMethod.Invoke(solver, null);

            regime = ReflectionUtility.GetHiddenField <int>("_regime", solver);
            Assert.AreEqual(3, regime);
            Assert.AreEqual(100, model.Species[0].Count);
            Assert.AreEqual(50, model.Species[1].Count);

            //4.  == Regime.AnythingElse
            ReflectionUtility.SetHiddenField("_regime", solver, 4);
            try
            {
                executeReactionsMethod.Invoke(solver, null);
                Assert.Fail();
            }
            catch (ApplicationException ex)
            {
                Assert.That(ex.GetBaseException().ToString(), Is.StringContaining("Bad solver mode."));
            }
        }