[med-svn] [cain] 05/07: Imported Upstream version 1.10+dfsg
Andreas Tille
tille at debian.org
Thu Dec 17 21:35:54 UTC 2015
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository cain.
commit b846fdeb5341f495e8ae526f5054a2b78e8872a0
Author: Andreas Tille <tille at debian.org>
Date: Thu Dec 17 22:28:57 2015 +0100
Imported Upstream version 1.10+dfsg
---
src/solvers/HomogeneousDirect.ipp | 250 ++++++++++++++++++++
src/solvers/HomogeneousDirect2DSearch.cc | 11 +
src/solvers/HomogeneousDirect2DSearch.d | 39 ++++
src/solvers/HomogeneousDirect2DSearchBubbleSort.cc | 11 +
src/solvers/HomogeneousDirect2DSearchBubbleSort.d | 44 ++++
src/solvers/HomogeneousDirect2DSearchSorted.cc | 11 +
src/solvers/HomogeneousDirect2DSearchSorted.d | 44 ++++
src/solvers/HomogeneousDirectAllReactions.ipp | 257 +++++++++++++++++++++
.../HomogeneousDirectAllReactions2DSearch.cc | 11 +
.../HomogeneousDirectAllReactions2DSearch.d | 41 ++++
src/solvers/HomogeneousDirectBinarySearch.cc | 12 +
src/solvers/HomogeneousDirectBinarySearch.d | 34 +++
.../HomogeneousDirectBinarySearchRecursiveCdf.cc | 13 ++
.../HomogeneousDirectBinarySearchRecursiveCdf.d | 35 +++
src/solvers/HomogeneousDirectBinarySearchSorted.cc | 14 ++
src/solvers/HomogeneousDirectBinarySearchSorted.d | 41 ++++
.../HomogeneousDirectCompositionRejection.cc | 12 +
.../HomogeneousDirectCompositionRejection.d | 39 ++++
src/solvers/HomogeneousDirectLinearSearch.cc | 12 +
src/solvers/HomogeneousDirectLinearSearch.d | 39 ++++
.../HomogeneousDirectLinearSearchBubbleSort.cc | 12 +
.../HomogeneousDirectLinearSearchBubbleSort.d | 43 ++++
.../HomogeneousDirectLinearSearchDelayedUpdate.cc | 12 +
.../HomogeneousDirectLinearSearchDelayedUpdate.d | 39 ++++
src/solvers/HomogeneousDirectLinearSearchSorted.cc | 14 ++
src/solvers/HomogeneousDirectLinearSearchSorted.d | 45 ++++
.../HomogeneousDirectRejectionBinsSplitting.cc | 13 ++
.../HomogeneousDirectRejectionBinsSplitting.d | 45 ++++
src/solvers/HomogeneousFirstReaction.cc | 20 ++
src/solvers/HomogeneousFirstReaction.d | 29 +++
src/solvers/HomogeneousFirstReaction.ipp | 193 ++++++++++++++++
.../HomogeneousFirstReactionAbsoluteTime.cc | 22 ++
src/solvers/HomogeneousFirstReactionAbsoluteTime.d | 31 +++
src/solvers/HomogeneousFirstReactionInfluence.cc | 22 ++
src/solvers/HomogeneousFirstReactionInfluence.d | 31 +++
...ogeneousHistogramFinalHypoexponentialDirect.ipp | 193 ++++++++++++++++
...sHistogramFinalHypoexponentialDirect2DSearch.cc | 9 +
...usHistogramFinalHypoexponentialDirect2DSearch.d | 38 +++
src/solvers/HomogeneousHistogramsAverage.cc | 11 +
src/solvers/HomogeneousHistogramsAverage.d | 43 ++++
src/solvers/HomogeneousHistogramsAverage.ipp | 207 +++++++++++++++++
src/solvers/HomogeneousHistogramsAverageAps.cc | 11 +
src/solvers/HomogeneousHistogramsAverageAps.d | 44 ++++
src/solvers/HomogeneousHistogramsAverageAps.ipp | 207 +++++++++++++++++
.../HomogeneousHistogramsAverageElapsedTime.cc | 11 +
.../HomogeneousHistogramsAverageElapsedTime.d | 46 ++++
.../HomogeneousHistogramsAverageElapsedTime.ipp | 207 +++++++++++++++++
src/solvers/HomogeneousHistogramsDirect.ipp | 190 +++++++++++++++
src/solvers/HomogeneousHistogramsDirect2DSearch.cc | 11 +
src/solvers/HomogeneousHistogramsDirect2DSearch.d | 43 ++++
src/solvers/HomogeneousHistogramsDirectTree.cc | 11 +
src/solvers/HomogeneousHistogramsDirectTree.d | 42 ++++
src/solvers/HomogeneousHistogramsDirectTree.ipp | 197 ++++++++++++++++
.../HomogeneousHistogramsMultiTimeDirect.ipp | 195 ++++++++++++++++
...HomogeneousHistogramsMultiTimeDirect2DSearch.cc | 11 +
.../HomogeneousHistogramsMultiTimeDirect2DSearch.d | 44 ++++
.../HomogeneousHistogramsTransientDirect.ipp | 184 +++++++++++++++
...HistogramsTransientDirectTreeExponentialLast.cc | 25 ++
...sHistogramsTransientDirectTreeExponentialLast.d | 44 ++++
...istogramsTransientDirectTreeExponentialLimit.cc | 25 ++
...HistogramsTransientDirectTreeExponentialLimit.d | 44 ++++
...gramsTransientDirectTreeHypoexponentialLimit.cc | 26 +++
...ogramsTransientDirectTreeHypoexponentialLimit.d | 45 ++++
...ogramsTransientDirectTreeNormalApproximation.cc | 26 +++
...togramsTransientDirectTreeNormalApproximation.d | 45 ++++
src/solvers/HomogeneousHybridDirectTauLeaping.ipp | 181 +++++++++++++++
.../HomogeneousHybridDirectTauLeapingForward.cc | 7 +
.../HomogeneousHybridDirectTauLeapingForward.d | 51 ++++
.../HomogeneousHybridDirectTauLeapingMidpoint.cc | 7 +
.../HomogeneousHybridDirectTauLeapingMidpoint.d | 51 ++++
...HomogeneousHybridDirectTauLeapingRungeKutta4.cc | 7 +
.../HomogeneousHybridDirectTauLeapingRungeKutta4.d | 51 ++++
src/solvers/HomogeneousNextReaction.ipp | 246 ++++++++++++++++++++
...HomogeneousNextReactionBinaryHeapGibsonBruck.cc | 11 +
.../HomogeneousNextReactionBinaryHeapGibsonBruck.d | 37 +++
.../HomogeneousNextReactionBinaryHeapPair.cc | 9 +
.../HomogeneousNextReactionBinaryHeapPair.d | 37 +++
.../HomogeneousNextReactionBinaryHeapPointer.cc | 9 +
.../HomogeneousNextReactionBinaryHeapPointer.d | 37 +++
src/solvers/HomogeneousNextReactionHashing.cc | 11 +
src/solvers/HomogeneousNextReactionHashing.d | 37 +++
.../HomogeneousNextReactionHashingGenericList.cc | 15 ++
.../HomogeneousNextReactionHashingGenericList.d | 39 ++++
.../HomogeneousNextReactionHashingGenericVector.cc | 14 ++
.../HomogeneousNextReactionHashingGenericVector.d | 39 ++++
.../HomogeneousNextReactionHashingVector.cc | 13 ++
src/solvers/HomogeneousNextReactionHashingVector.d | 39 ++++
src/solvers/HomogeneousNextReactionLinearSearch.cc | 9 +
src/solvers/HomogeneousNextReactionLinearSearch.d | 38 +++
.../HomogeneousNextReactionLinearSearchPointer.cc | 9 +
.../HomogeneousNextReactionLinearSearchPointer.d | 36 +++
.../HomogeneousNextReactionLinearSearchUnrolled.cc | 9 +
.../HomogeneousNextReactionLinearSearchUnrolled.d | 39 ++++
...HomogeneousNextReactionPartitionCostAdaptive.cc | 12 +
.../HomogeneousNextReactionPartitionCostAdaptive.d | 38 +++
.../HomogeneousNextReactionPartitionFixedSize.cc | 10 +
.../HomogeneousNextReactionPartitionFixedSize.d | 38 +++
...HomogeneousNextReactionPartitionPropensities.cc | 10 +
.../HomogeneousNextReactionPartitionPropensities.d | 38 +++
...HomogeneousNextReactionPartitionSizeAdaptive.cc | 12 +
.../HomogeneousNextReactionPartitionSizeAdaptive.d | 38 +++
src/solvers/HomogeneousOdeReaction.ipp | 215 +++++++++++++++++
src/solvers/HomogeneousOdeReactionFixedForward.cc | 8 +
src/solvers/HomogeneousOdeReactionFixedForward.d | 19 ++
src/solvers/HomogeneousOdeReactionFixedMidpoint.cc | 8 +
src/solvers/HomogeneousOdeReactionFixedMidpoint.d | 19 ++
.../HomogeneousOdeReactionFixedRungeKutta4.cc | 8 +
.../HomogeneousOdeReactionFixedRungeKutta4.d | 19 ++
...omogeneousOdeReactionFixedRungeKuttaCashKarp.cc | 8 +
...HomogeneousOdeReactionFixedRungeKuttaCashKarp.d | 20 ++
.../HomogeneousOdeReactionRungeKuttaCashKarp.cc | 7 +
.../HomogeneousOdeReactionRungeKuttaCashKarp.d | 19 ++
src/solvers/HomogeneousTauLeaping.ipp | 188 +++++++++++++++
src/solvers/HomogeneousTauLeapingFixedForward.cc | 10 +
src/solvers/HomogeneousTauLeapingFixedForward.d | 41 ++++
src/solvers/HomogeneousTauLeapingFixedMidpoint.cc | 10 +
src/solvers/HomogeneousTauLeapingFixedMidpoint.d | 41 ++++
.../HomogeneousTauLeapingFixedRungeKutta4.cc | 10 +
.../HomogeneousTauLeapingFixedRungeKutta4.d | 41 ++++
src/solvers/HomogeneousTauLeapingForward.cc | 9 +
src/solvers/HomogeneousTauLeapingForward.d | 41 ++++
.../HomogeneousTauLeapingForwardNoCorrection.cc | 9 +
.../HomogeneousTauLeapingForwardNoCorrection.d | 41 ++++
src/solvers/HomogeneousTauLeapingImplicit.ipp | 160 +++++++++++++
.../HomogeneousTauLeapingImplicitFixedEuler.cc | 7 +
.../HomogeneousTauLeapingImplicitFixedEuler.d | 97 ++++++++
src/solvers/HomogeneousTauLeapingMidpoint.cc | 9 +
src/solvers/HomogeneousTauLeapingMidpoint.d | 41 ++++
.../HomogeneousTauLeapingMidpointNoCorrection.cc | 9 +
.../HomogeneousTauLeapingMidpointNoCorrection.d | 41 ++++
src/solvers/HomogeneousTauLeapingRungeKutta4.cc | 9 +
src/solvers/HomogeneousTauLeapingRungeKutta4.d | 41 ++++
...HomogeneousTauLeapingRungeKutta4NoCorrection.cc | 9 +
.../HomogeneousTauLeapingRungeKutta4NoCorrection.d | 42 ++++
src/solvers/HomogeneousTauLeapingSal.ipp | 171 ++++++++++++++
src/solvers/HomogeneousTauLeapingSalFixedLinear.cc | 7 +
src/solvers/HomogeneousTauLeapingSalFixedLinear.d | 42 ++++
src/solvers/HomogeneousTauLeapingSalLinear.cc | 5 +
src/solvers/HomogeneousTauLeapingSalLinear.d | 42 ++++
src/solvers/HomogeneousTrajectoryTreeFull.cc | 190 +++++++++++++++
src/solvers/HomogeneousTrajectoryTreeFull.d | 31 +++
...ogeneousHistogramsSteadyStateDirectTimeSteps.cc | 165 +++++++++++++
.../InhomogeneousHistogramsTransientDirect.cc | 159 +++++++++++++
.../InhomogeneousOdeReactionRungeKuttaCashKarp.cc | 165 +++++++++++++
.../InhomogeneousTimeSeriesAllReactionsDirect.cc | 179 ++++++++++++++
.../InhomogeneousTimeSeriesUniformDirect.cc | 171 ++++++++++++++
src/solvers/Makefile | 66 ++++++
src/solvers/Makefile.compilers | 150 ++++++++++++
src/solvers/Propensities.h | 112 +++++++++
src/solvers/SConstruct | 15 ++
src/solvers/env.py | 54 +++++
src/solvers/input.ipp | 108 +++++++++
src/solvers/msvs.py | 37 +++
src/solvers/vc10vars32.bat | 123 ++++++++++
src/solvers/vcvars32.bat | 1 +
155 files changed, 8309 insertions(+)
diff --git a/src/solvers/HomogeneousDirect.ipp b/src/solvers/HomogeneousDirect.ipp
new file mode 100644
index 0000000..a6c15e8
--- /dev/null
+++ b/src/solvers/HomogeneousDirect.ipp
@@ -0,0 +1,250 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousDirect_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/Direct.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+#define STOCHASTIC_USE_INFLUENCE
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+#ifdef STOCHASTIC_USE_INFLUENCE
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#else
+ // Otherwise, we compute the propensities all at once.
+ typedef stochastic::PropensitiesAll<true> PropensitiesFunctor;
+#endif
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::Direct<DiscreteGenerator, ExponentialGenerator,
+ PropensitiesFunctor> Direct;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Build the array of reaction influences.
+ //
+
+ // If not used, this is left empty.
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+#ifdef STOCHASTIC_USE_INFLUENCE
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+#endif
+
+ //
+ // Construct the simulation class.
+ //
+ Direct solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // CONTINUE
+ //
+ // Get more repairing and rebuilding options.
+ //
+
+#ifdef STOCHASTIC_REPAIR
+ // For loosely coupled problems, you can specify how many steps to take
+ // between repairs.
+ DiscreteGenerator::Counter stepsBetweenRepairs = 0;
+ if (parser.getOption("repair", &stepsBetweenRepairs)) {
+ if (stepsBetweenRepairs < 1) {
+ std::cerr
+ << "Error: Bad value for the number of steps between repairs.\n";
+ exitOnError();
+ }
+ solver.getDiscreteGenerator().
+ setStepsBetweenRepairs(stepsBetweenRepairs);
+ }
+#endif
+
+#ifdef STOCHASTIC_REBUILD
+ // The number of steps to take between rebuilds.
+ DiscreteGenerator::Counter stepsBetweenRebuilds = 0;
+ if (parser.getOption("rebuild", &stepsBetweenRebuilds)) {
+ if (stepsBetweenRebuilds < 1) {
+ std::cerr
+ << "Error: Bad value for the number of steps between rebuilds.\n";
+ exitOnError();
+ }
+ solver.getDiscreteGenerator().
+ setStepsBetweenRebuilds(stepsBetweenRebuilds);
+ }
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ timer.tic();
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+ solver.simulate(frameTimes[i]);
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousDirect2DSearch.cc b/src/solvers/HomogeneousDirect2DSearch.cc
new file mode 100644
index 0000000..1c0b36b
--- /dev/null
+++ b/src/solvers/HomogeneousDirect2DSearch.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirect2DSearch.d b/src/solvers/HomogeneousDirect2DSearch.d
new file mode 100644
index 0000000..3bee515
--- /dev/null
+++ b/src/solvers/HomogeneousDirect2DSearch.d
@@ -0,0 +1,39 @@
+HomogeneousDirect2DSearch.o HomogeneousDirect2DSearch.d : HomogeneousDirect2DSearch.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirect2DSearchBubbleSort.cc b/src/solvers/HomogeneousDirect2DSearchBubbleSort.cc
new file mode 100644
index 0000000..156fa91
--- /dev/null
+++ b/src/solvers/HomogeneousDirect2DSearchBubbleSort.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearchBubbleSort.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearchBubbleSort<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirect2DSearchBubbleSort.d b/src/solvers/HomogeneousDirect2DSearchBubbleSort.d
new file mode 100644
index 0000000..4219e78
--- /dev/null
+++ b/src/solvers/HomogeneousDirect2DSearchBubbleSort.d
@@ -0,0 +1,44 @@
+HomogeneousDirect2DSearchBubbleSort.o HomogeneousDirect2DSearchBubbleSort.d : \
+ HomogeneousDirect2DSearchBubbleSort.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchBubbleSort.h \
+ ../numerical/random/discrete/DgPmfOrderedPairPointer.h \
+ ../numerical/random/discrete/../../../ads/iterator/TransformIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/AdaptedIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/../functor/index.h \
+ ../numerical/random/discrete/../../../ads/functor/select.h \
+ ../numerical/random/discrete/../../../ext/pair.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../../../ads/counter/CounterWithReset.h \
+ ../numerical/random/discrete/../../../ads/counter/Counter.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirect2DSearchSorted.cc b/src/solvers/HomogeneousDirect2DSearchSorted.cc
new file mode 100644
index 0000000..d473199
--- /dev/null
+++ b/src/solvers/HomogeneousDirect2DSearchSorted.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearchSorted.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearchSorted<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirect2DSearchSorted.d b/src/solvers/HomogeneousDirect2DSearchSorted.d
new file mode 100644
index 0000000..19f23aa
--- /dev/null
+++ b/src/solvers/HomogeneousDirect2DSearchSorted.d
@@ -0,0 +1,44 @@
+HomogeneousDirect2DSearchSorted.o HomogeneousDirect2DSearchSorted.d : HomogeneousDirect2DSearchSorted.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchSorted.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchSortedStatic.h \
+ ../numerical/random/discrete/DgPmfOrderedPairPointer.h \
+ ../numerical/random/discrete/../../../ads/iterator/TransformIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/AdaptedIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/../functor/index.h \
+ ../numerical/random/discrete/../../../ads/functor/select.h \
+ ../numerical/random/discrete/../../../ext/pair.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../../../ads/counter/CounterWithReset.h \
+ ../numerical/random/discrete/../../../ads/counter/Counter.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectAllReactions.ipp b/src/solvers/HomogeneousDirectAllReactions.ipp
new file mode 100644
index 0000000..6ff298b
--- /dev/null
+++ b/src/solvers/HomogeneousDirectAllReactions.ipp
@@ -0,0 +1,257 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousDirectAllReactions_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/Direct.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+#define STOCHASTIC_USE_INFLUENCE
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+#ifdef STOCHASTIC_USE_INFLUENCE
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#else
+ // Otherwise, we compute the propensities all at once.
+ typedef stochastic::PropensitiesAll<true> PropensitiesFunctor;
+#endif
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::Direct<DiscreteGenerator, ExponentialGenerator,
+ PropensitiesFunctor> Direct;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Equilibration time.
+ double equilibrationTime;
+ std::cin >> equilibrationTime;
+
+ // Recording time.
+ double recordingTime;
+ std::cin >> recordingTime;
+
+ //
+ // Build the array of reaction influences.
+ //
+
+ // If not used, this is left empty.
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+#ifdef STOCHASTIC_USE_INFLUENCE
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+#endif
+
+ //
+ // Construct the simulation class.
+ //
+ Direct solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // CONTINUE
+ //
+ // Get more repairing and rebuilding options.
+ //
+
+#ifdef STOCHASTIC_REPAIR
+ // For loosely coupled problems, you can specify how many steps to take
+ // between repairs.
+ DiscreteGenerator::Counter stepsBetweenRepairs = 0;
+ if (parser.getOption("repair", &stepsBetweenRepairs)) {
+ if (stepsBetweenRepairs < 1) {
+ std::cerr
+ << "Error: Bad value for the number of steps between repairs.\n";
+ exitOnError();
+ }
+ solver.getDiscreteGenerator().
+ setStepsBetweenRepairs(stepsBetweenRepairs);
+ }
+#endif
+
+#ifdef STOCHASTIC_REBUILD
+ // The number of steps to take between rebuilds.
+ DiscreteGenerator::Counter stepsBetweenRebuilds = 0;
+ if (parser.getOption("rebuild", &stepsBetweenRebuilds)) {
+ if (stepsBetweenRebuilds < 1) {
+ std::cerr
+ << "Error: Bad value for the number of steps between rebuilds.\n";
+ exitOnError();
+ }
+ solver.getDiscreteGenerator().
+ setStepsBetweenRebuilds(stepsBetweenRebuilds);
+ }
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the reaction indices and times.
+ std::vector<double> equilibratedPopulations(numberOfSpecies);
+ std::vector<std::size_t> reactionIndices;
+ std::back_insert_iterator<std::vector<std::size_t> >
+ indicesIterator(reactionIndices);
+ std::vector<double> reactionTimes;
+ std::back_insert_iterator<std::vector<double> > timesIterator(reactionTimes);
+ double totalReactionCount = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the reaction indices and times.
+ reactionIndices.clear();
+ reactionTimes.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ timer.tic();
+ solver.initialize(initialPopulations, startTime);
+ // Equilibrate
+ if (equilibrationTime != 0) {
+ solver.equilibrate(equilibrationTime);
+ }
+ std::copy(solver.getState().getPopulations().begin(),
+ solver.getState().getPopulations().end(),
+ equilibratedPopulations.begin());
+ // Simulate and record.
+ solver.simulate(startTime + equilibrationTime + recordingTime,
+ indicesIterator, timesIterator);
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // Write the initial (possibly equilibrated) populations.
+ std::copy(equilibratedPopulations.begin(),
+ equilibratedPopulations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction indices.
+ std::copy(reactionIndices.begin(), reactionIndices.end(),
+ std::ostream_iterator<std::size_t>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction times.
+ std::cout.precision(16);
+ std::copy(reactionTimes.begin(), reactionTimes.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout.precision(3);
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousDirectAllReactions2DSearch.cc b/src/solvers/HomogeneousDirectAllReactions2DSearch.cc
new file mode 100644
index 0000000..408c33a
--- /dev/null
+++ b/src/solvers/HomogeneousDirectAllReactions2DSearch.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousDirectAllReactions_ipp__
+#include "HomogeneousDirectAllReactions.ipp"
+#undef __HomogeneousDirectAllReactions_ipp__
diff --git a/src/solvers/HomogeneousDirectAllReactions2DSearch.d b/src/solvers/HomogeneousDirectAllReactions2DSearch.d
new file mode 100644
index 0000000..6ab6ebf
--- /dev/null
+++ b/src/solvers/HomogeneousDirectAllReactions2DSearch.d
@@ -0,0 +1,41 @@
+HomogeneousDirectAllReactions2DSearch.o HomogeneousDirectAllReactions2DSearch.d : \
+ HomogeneousDirectAllReactions2DSearch.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousDirectAllReactions.ipp ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectBinarySearch.cc b/src/solvers/HomogeneousDirectBinarySearch.cc
new file mode 100644
index 0000000..7c839ea
--- /dev/null
+++ b/src/solvers/HomogeneousDirectBinarySearch.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorBinarySearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorBinarySearch<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectBinarySearch.d b/src/solvers/HomogeneousDirectBinarySearch.d
new file mode 100644
index 0000000..b1b050e
--- /dev/null
+++ b/src/solvers/HomogeneousDirectBinarySearch.d
@@ -0,0 +1,34 @@
+HomogeneousDirectBinarySearch.o HomogeneousDirectBinarySearch.d : HomogeneousDirectBinarySearch.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorBinarySearch.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectBinarySearchRecursiveCdf.cc b/src/solvers/HomogeneousDirectBinarySearchRecursiveCdf.cc
new file mode 100644
index 0000000..f663019
--- /dev/null
+++ b/src/solvers/HomogeneousDirectBinarySearchRecursiveCdf.cc
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorBinarySearchRecursiveCdf.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorBinarySearchRecursiveCdf<>
+DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectBinarySearchRecursiveCdf.d b/src/solvers/HomogeneousDirectBinarySearchRecursiveCdf.d
new file mode 100644
index 0000000..6f87af4
--- /dev/null
+++ b/src/solvers/HomogeneousDirectBinarySearchRecursiveCdf.d
@@ -0,0 +1,35 @@
+HomogeneousDirectBinarySearchRecursiveCdf.o HomogeneousDirectBinarySearchRecursiveCdf.d : \
+ HomogeneousDirectBinarySearchRecursiveCdf.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorBinarySearchRecursiveCdf.h \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/DiscreteGeneratorBinarySearchRecursiveCdf.ipp \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectBinarySearchSorted.cc b/src/solvers/HomogeneousDirectBinarySearchSorted.cc
new file mode 100644
index 0000000..07020f7
--- /dev/null
+++ b/src/solvers/HomogeneousDirectBinarySearchSorted.cc
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorBinarySearchSorted.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorBinarySearchSorted<> DiscreteGenerator;
+
+#define STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectBinarySearchSorted.d b/src/solvers/HomogeneousDirectBinarySearchSorted.d
new file mode 100644
index 0000000..e7541fc
--- /dev/null
+++ b/src/solvers/HomogeneousDirectBinarySearchSorted.d
@@ -0,0 +1,41 @@
+HomogeneousDirectBinarySearchSorted.o HomogeneousDirectBinarySearchSorted.d : \
+ HomogeneousDirectBinarySearchSorted.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorBinarySearchSorted.h \
+ ../numerical/random/discrete/DgPmfOrderedPairPointer.h \
+ ../numerical/random/discrete/../../../ads/iterator/TransformIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/AdaptedIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/../functor/index.h \
+ ../numerical/random/discrete/../../../ads/functor/select.h \
+ ../numerical/random/discrete/../../../ext/pair.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../../../ads/counter/CounterWithReset.h \
+ ../numerical/random/discrete/../../../ads/counter/Counter.h \
+ ../numerical/random/discrete/../../../array/StaticArrayOfArrays.h \
+ ../numerical/random/discrete/../../../array/../ext/vector.h \
+ ../numerical/random/discrete/../../../array/StaticArrayOfArrays.ipp \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectCompositionRejection.cc b/src/solvers/HomogeneousDirectCompositionRejection.cc
new file mode 100644
index 0000000..8a5ac6a
--- /dev/null
+++ b/src/solvers/HomogeneousDirectCompositionRejection.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorCompositionRejection.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorCompositionRejection<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectCompositionRejection.d b/src/solvers/HomogeneousDirectCompositionRejection.d
new file mode 100644
index 0000000..1514e02
--- /dev/null
+++ b/src/solvers/HomogeneousDirectCompositionRejection.d
@@ -0,0 +1,39 @@
+HomogeneousDirectCompositionRejection.o HomogeneousDirectCompositionRejection.d : \
+ HomogeneousDirectCompositionRejection.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorCompositionRejection.h \
+ ../numerical/random/discrete/DiscreteGeneratorCompositionRejectionStatic.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectLinearSearch.cc b/src/solvers/HomogeneousDirectLinearSearch.cc
new file mode 100644
index 0000000..fa3bf68
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearch.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorLinearSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorLinearSearch<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectLinearSearch.d b/src/solvers/HomogeneousDirectLinearSearch.d
new file mode 100644
index 0000000..86cb5d6
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearch.d
@@ -0,0 +1,39 @@
+HomogeneousDirectLinearSearch.o HomogeneousDirectLinearSearch.d : HomogeneousDirectLinearSearch.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorLinearSearch.h \
+ ../numerical/random/discrete/DgPmfAndSum.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectLinearSearchBubbleSort.cc b/src/solvers/HomogeneousDirectLinearSearchBubbleSort.cc
new file mode 100644
index 0000000..a3d318b
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearchBubbleSort.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorLinearSearchBubbleSort.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorLinearSearchBubbleSort<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectLinearSearchBubbleSort.d b/src/solvers/HomogeneousDirectLinearSearchBubbleSort.d
new file mode 100644
index 0000000..a94881b
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearchBubbleSort.d
@@ -0,0 +1,43 @@
+HomogeneousDirectLinearSearchBubbleSort.o HomogeneousDirectLinearSearchBubbleSort.d : \
+ HomogeneousDirectLinearSearchBubbleSort.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorLinearSearchBubbleSort.h \
+ ../numerical/random/discrete/DgPmfAndSumOrderedPairPointer.h \
+ ../numerical/random/discrete/DgPmfOrderedPairPointer.h \
+ ../numerical/random/discrete/../../../ads/iterator/TransformIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/AdaptedIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/../functor/index.h \
+ ../numerical/random/discrete/../../../ads/functor/select.h \
+ ../numerical/random/discrete/../../../ext/pair.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectLinearSearchDelayedUpdate.cc b/src/solvers/HomogeneousDirectLinearSearchDelayedUpdate.cc
new file mode 100644
index 0000000..694a772
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearchDelayedUpdate.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorLinearSearchDelayedUpdate.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorLinearSearchDelayedUpdate<> DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectLinearSearchDelayedUpdate.d b/src/solvers/HomogeneousDirectLinearSearchDelayedUpdate.d
new file mode 100644
index 0000000..095b4d1
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearchDelayedUpdate.d
@@ -0,0 +1,39 @@
+HomogeneousDirectLinearSearchDelayedUpdate.o HomogeneousDirectLinearSearchDelayedUpdate.d : \
+ HomogeneousDirectLinearSearchDelayedUpdate.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorLinearSearchDelayedUpdate.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectLinearSearchSorted.cc b/src/solvers/HomogeneousDirectLinearSearchSorted.cc
new file mode 100644
index 0000000..757bcca
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearchSorted.cc
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorLinearSearchSorted.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorLinearSearchSorted<> DiscreteGenerator;
+
+#define STOCHASTIC_REBUILD
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectLinearSearchSorted.d b/src/solvers/HomogeneousDirectLinearSearchSorted.d
new file mode 100644
index 0000000..35be400
--- /dev/null
+++ b/src/solvers/HomogeneousDirectLinearSearchSorted.d
@@ -0,0 +1,45 @@
+HomogeneousDirectLinearSearchSorted.o HomogeneousDirectLinearSearchSorted.d : \
+ HomogeneousDirectLinearSearchSorted.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorLinearSearchSorted.h \
+ ../numerical/random/discrete/DgPmfAndSumOrderedPairPointer.h \
+ ../numerical/random/discrete/DgPmfOrderedPairPointer.h \
+ ../numerical/random/discrete/../../../ads/iterator/TransformIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/AdaptedIterator.h \
+ ../numerical/random/discrete/../../../ads/iterator/../functor/index.h \
+ ../numerical/random/discrete/../../../ads/functor/select.h \
+ ../numerical/random/discrete/../../../ext/pair.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../../../ads/counter/CounterWithReset.h \
+ ../numerical/random/discrete/../../../ads/counter/Counter.h \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousDirectRejectionBinsSplitting.cc b/src/solvers/HomogeneousDirectRejectionBinsSplitting.cc
new file mode 100644
index 0000000..1ca042d
--- /dev/null
+++ b/src/solvers/HomogeneousDirectRejectionBinsSplitting.cc
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGeneratorRejectionBinsSplitting.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+typedef numerical::DiscreteGeneratorRejectionBinsSplitting<true>
+DiscreteGenerator;
+
+#define __HomogeneousDirect_ipp__
+#include "HomogeneousDirect.ipp"
+#undef __HomogeneousDirect_ipp__
diff --git a/src/solvers/HomogeneousDirectRejectionBinsSplitting.d b/src/solvers/HomogeneousDirectRejectionBinsSplitting.d
new file mode 100644
index 0000000..434ae68
--- /dev/null
+++ b/src/solvers/HomogeneousDirectRejectionBinsSplitting.d
@@ -0,0 +1,45 @@
+HomogeneousDirectRejectionBinsSplitting.o HomogeneousDirectRejectionBinsSplitting.d : \
+ HomogeneousDirectRejectionBinsSplitting.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorRejectionBinsSplitting.h \
+ ../numerical/random/discrete/DiscreteGeneratorRejectionBinsSplittingStatic.h \
+ ../numerical/random/discrete/DgBinConstants.h \
+ ../numerical/random/discrete/../uniform/Default.h \
+ ../numerical/random/discrete/../../../ads/algorithm/sort.h \
+ ../numerical/random/discrete/../../../ads/algorithm/Triplet.h \
+ ../numerical/random/discrete/../../../ads/algorithm/../functor/compose.h \
+ ../numerical/random/discrete/../../../ads/algorithm/../functor/select.h \
+ ../numerical/random/discrete/../../../ads/algorithm/sort.ipp \
+ ../numerical/random/discrete/../../../ads/functor/compare_handle.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/DiscreteGeneratorRejectionBinsSplittingStatic.ipp \
+ ../numerical/random/discrete/DiscreteGeneratorRejectionBinsSplitting.ipp \
+ HomogeneousDirect.ipp ../stochastic/Direct.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousFirstReaction.cc b/src/solvers/HomogeneousFirstReaction.cc
new file mode 100644
index 0000000..2698b5a
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReaction.cc
@@ -0,0 +1,20 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "stochastic/FirstReaction.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef stochastic::FirstReaction<ExponentialGenerator, PropensitiesFunctor>
+FirstReaction;
+
+#define __HomogeneousFirstReaction_ipp__
+#include "HomogeneousFirstReaction.ipp"
+#undef __HomogeneousFirstReaction_ipp__
diff --git a/src/solvers/HomogeneousFirstReaction.d b/src/solvers/HomogeneousFirstReaction.d
new file mode 100644
index 0000000..e8ec2c4
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReaction.d
@@ -0,0 +1,29 @@
+HomogeneousFirstReaction.o HomogeneousFirstReaction.d : HomogeneousFirstReaction.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/FirstReaction.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/FirstReaction.ipp \
+ HomogeneousFirstReaction.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousFirstReaction.ipp b/src/solvers/HomogeneousFirstReaction.ipp
new file mode 100644
index 0000000..3969095
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReaction.ipp
@@ -0,0 +1,193 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousFirstReaction_ipp__
+#error This file is an implementation detail.
+#endif
+
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+#ifdef STOCHASTIC_USE_INFLUENCE
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, false);
+ //
+ // Construct the simulation class.
+ //
+ FirstReaction solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ maximumAllowedSteps);
+#else
+ FirstReaction solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), maximumAllowedSteps);
+#endif
+
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double>
+ reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ timer.tic();
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+ solver.simulate(frameTimes[i]);
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousFirstReactionAbsoluteTime.cc b/src/solvers/HomogeneousFirstReactionAbsoluteTime.cc
new file mode 100644
index 0000000..c9c3405
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReactionAbsoluteTime.cc
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "stochastic/FirstReactionAbsoluteTime.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef stochastic::FirstReactionAbsoluteTime<ExponentialGenerator, PropensitiesFunctor>
+FirstReaction;
+
+#define STOCHASTIC_USE_INFLUENCE
+
+#define __HomogeneousFirstReaction_ipp__
+#include "HomogeneousFirstReaction.ipp"
+#undef __HomogeneousFirstReaction_ipp__
diff --git a/src/solvers/HomogeneousFirstReactionAbsoluteTime.d b/src/solvers/HomogeneousFirstReactionAbsoluteTime.d
new file mode 100644
index 0000000..821b618
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReactionAbsoluteTime.d
@@ -0,0 +1,31 @@
+HomogeneousFirstReactionAbsoluteTime.o HomogeneousFirstReactionAbsoluteTime.d : \
+ HomogeneousFirstReactionAbsoluteTime.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/FirstReactionAbsoluteTime.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/FirstReactionAbsoluteTime.ipp \
+ HomogeneousFirstReaction.ipp ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousFirstReactionInfluence.cc b/src/solvers/HomogeneousFirstReactionInfluence.cc
new file mode 100644
index 0000000..6e16841
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReactionInfluence.cc
@@ -0,0 +1,22 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "stochastic/FirstReactionInfluence.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef stochastic::FirstReactionInfluence<ExponentialGenerator, PropensitiesFunctor>
+FirstReaction;
+
+#define STOCHASTIC_USE_INFLUENCE
+
+#define __HomogeneousFirstReaction_ipp__
+#include "HomogeneousFirstReaction.ipp"
+#undef __HomogeneousFirstReaction_ipp__
diff --git a/src/solvers/HomogeneousFirstReactionInfluence.d b/src/solvers/HomogeneousFirstReactionInfluence.d
new file mode 100644
index 0000000..d98f977
--- /dev/null
+++ b/src/solvers/HomogeneousFirstReactionInfluence.d
@@ -0,0 +1,31 @@
+HomogeneousFirstReactionInfluence.o HomogeneousFirstReactionInfluence.d : \
+ HomogeneousFirstReactionInfluence.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/FirstReactionInfluence.h ../stochastic/FirstReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/FirstReaction.ipp \
+ ../stochastic/FirstReactionInfluence.ipp HomogeneousFirstReaction.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect.ipp b/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect.ipp
new file mode 100644
index 0000000..483bd14
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect.ipp
@@ -0,0 +1,193 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramFinalHypoexponentialDirect_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramFinalHypoexponentialDirect.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the histogram to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef DiscreteGenerator::DiscreteUniformGenerator DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramFinalHypoexponentialDirect<DiscreteGenerator,
+ PropensitiesFunctor> Solver;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+ // Only one frame is allowed.
+ assert(frameTimes.size() == 1);
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect2DSearch.cc b/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect2DSearch.cc
new file mode 100644
index 0000000..53354ae
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect2DSearch.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramFinalHypoexponentialDirect_ipp__
+#include "HomogeneousHistogramFinalHypoexponentialDirect.ipp"
+#undef __HomogeneousHistogramFinalHypoexponentialDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect2DSearch.d b/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect2DSearch.d
new file mode 100644
index 0000000..384087b
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramFinalHypoexponentialDirect2DSearch.d
@@ -0,0 +1,38 @@
+HomogeneousHistogramFinalHypoexponentialDirect2DSearch.o HomogeneousHistogramFinalHypoexponentialDirect2DSearch.d : \
+ HomogeneousHistogramFinalHypoexponentialDirect2DSearch.cc \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/discrete/../uniform/Default.h \
+ ../numerical/random/discrete/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/discrete/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ HomogeneousHistogramFinalHypoexponentialDirect.ipp \
+ ../stochastic/HistogramFinalHypoexponentialDirect.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/HistogramsPackedArray.h ../stochastic/HistogramsPacked.h \
+ ../stochastic/HistogramReference.h ../stochastic/TimeEpochOffset.h \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsAverage.cc b/src/solvers/HomogeneousHistogramsAverage.cc
new file mode 100644
index 0000000..f63982d
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverage.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramsAverage_ipp__
+#include "HomogeneousHistogramsAverage.ipp"
+#undef __HomogeneousHistogramsAverage_ipp__
diff --git a/src/solvers/HomogeneousHistogramsAverage.d b/src/solvers/HomogeneousHistogramsAverage.d
new file mode 100644
index 0000000..59d35da
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverage.d
@@ -0,0 +1,43 @@
+HomogeneousHistogramsAverage.o HomogeneousHistogramsAverage.d : HomogeneousHistogramsAverage.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsAverage.ipp ../stochastic/HistogramsAverage.h \
+ ../stochastic/HistogramsAverageBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsAveragePackedArray.h \
+ ../stochastic/HistogramsAveragePacked.h \
+ ../stochastic/HistogramReference.h ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsAverage.ipp b/src/solvers/HomogeneousHistogramsAverage.ipp
new file mode 100644
index 0000000..e5d643c
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverage.ipp
@@ -0,0 +1,207 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsAverage_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramsAverage.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+#define STOCHASTIC_USE_INFLUENCE
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the histograms to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+#ifdef STOCHASTIC_USE_INFLUENCE
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#else
+ // Otherwise, we compute the propensities all at once.
+ typedef stochastic::PropensitiesAll<true> PropensitiesFunctor;
+#endif
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramsAverage<DiscreteGenerator,
+ ExponentialGenerator, PropensitiesFunctor> Direct;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Equilibration time
+ double equilibrationTime;
+ std::cin >> equilibrationTime;
+
+ // Recording time
+ double recordingTime;
+ std::cin >> recordingTime;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+
+ // If not used, this is left empty.
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+#ifdef STOCHASTIC_USE_INFLUENCE
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+#endif
+
+ //
+ // Construct the simulation class.
+ //
+ Direct solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ recordedSpecies, numberOfBins, histogramMultiplicity,
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ if (! solver.getError().empty()) {
+ break;
+ }
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate(equilibrationTime, recordingTime);
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsAverageAps.cc b/src/solvers/HomogeneousHistogramsAverageAps.cc
new file mode 100644
index 0000000..36c1c6d
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverageAps.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramsAverageAps_ipp__
+#include "HomogeneousHistogramsAverageAps.ipp"
+#undef __HomogeneousHistogramsAverageAps_ipp__
diff --git a/src/solvers/HomogeneousHistogramsAverageAps.d b/src/solvers/HomogeneousHistogramsAverageAps.d
new file mode 100644
index 0000000..cc55aeb
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverageAps.d
@@ -0,0 +1,44 @@
+HomogeneousHistogramsAverageAps.o HomogeneousHistogramsAverageAps.d : HomogeneousHistogramsAverageAps.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsAverageAps.ipp \
+ ../stochastic/HistogramsAverageAps.h \
+ ../stochastic/HistogramsAverageBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsAveragePackedArray.h \
+ ../stochastic/HistogramsAveragePacked.h \
+ ../stochastic/HistogramReference.h ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsAverageAps.ipp b/src/solvers/HomogeneousHistogramsAverageAps.ipp
new file mode 100644
index 0000000..f8b1a16
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverageAps.ipp
@@ -0,0 +1,207 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsAverageAps_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramsAverageAps.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+#define STOCHASTIC_USE_INFLUENCE
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the histograms to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+#ifdef STOCHASTIC_USE_INFLUENCE
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#else
+ // Otherwise, we compute the propensities all at once.
+ typedef stochastic::PropensitiesAll<true> PropensitiesFunctor;
+#endif
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramsAverageAps<DiscreteGenerator,
+ ExponentialGenerator, PropensitiesFunctor> Direct;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Equilibration time
+ double equilibrationTime;
+ std::cin >> equilibrationTime;
+
+ // Recording time
+ double recordingTime;
+ std::cin >> recordingTime;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+
+ // If not used, this is left empty.
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+#ifdef STOCHASTIC_USE_INFLUENCE
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+#endif
+
+ //
+ // Construct the simulation class.
+ //
+ Direct solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ recordedSpecies, numberOfBins, histogramMultiplicity,
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ if (! solver.getError().empty()) {
+ break;
+ }
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate(equilibrationTime, recordingTime);
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsAverageElapsedTime.cc b/src/solvers/HomogeneousHistogramsAverageElapsedTime.cc
new file mode 100644
index 0000000..598110d
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverageElapsedTime.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramsAverageElapsedTime_ipp__
+#include "HomogeneousHistogramsAverageElapsedTime.ipp"
+#undef __HomogeneousHistogramsAverageElapsedTime_ipp__
diff --git a/src/solvers/HomogeneousHistogramsAverageElapsedTime.d b/src/solvers/HomogeneousHistogramsAverageElapsedTime.d
new file mode 100644
index 0000000..d6c382b
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverageElapsedTime.d
@@ -0,0 +1,46 @@
+HomogeneousHistogramsAverageElapsedTime.o HomogeneousHistogramsAverageElapsedTime.d : \
+ HomogeneousHistogramsAverageElapsedTime.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsAverageElapsedTime.ipp \
+ ../stochastic/HistogramsAverageElapsedTime.h \
+ ../stochastic/HistogramsAverageBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsAveragePackedArray.h \
+ ../stochastic/HistogramsAveragePacked.h \
+ ../stochastic/HistogramReference.h \
+ ../stochastic/modifiedRecordedSpecies.h ../stochastic/ReactionSet.h \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsAverageElapsedTime.ipp b/src/solvers/HomogeneousHistogramsAverageElapsedTime.ipp
new file mode 100644
index 0000000..1532fe8
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsAverageElapsedTime.ipp
@@ -0,0 +1,207 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsAverageElapsedTime_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramsAverageElapsedTime.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+#define STOCHASTIC_USE_INFLUENCE
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the histograms to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+#ifdef STOCHASTIC_USE_INFLUENCE
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#else
+ // Otherwise, we compute the propensities all at once.
+ typedef stochastic::PropensitiesAll<true> PropensitiesFunctor;
+#endif
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramsAverageElapsedTime<DiscreteGenerator,
+ ExponentialGenerator, PropensitiesFunctor> Direct;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Equilibration time
+ double equilibrationTime;
+ std::cin >> equilibrationTime;
+
+ // Recording time
+ double recordingTime;
+ std::cin >> recordingTime;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+
+ // If not used, this is left empty.
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+#ifdef STOCHASTIC_USE_INFLUENCE
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+#endif
+
+ //
+ // Construct the simulation class.
+ //
+ Direct solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ recordedSpecies, numberOfBins, histogramMultiplicity,
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ if (! solver.getError().empty()) {
+ break;
+ }
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate(equilibrationTime, recordingTime);
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsDirect.ipp b/src/solvers/HomogeneousHistogramsDirect.ipp
new file mode 100644
index 0000000..67768e8
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsDirect.ipp
@@ -0,0 +1,190 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsDirect_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramsDirect.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramsDirect<DiscreteGenerator, ExponentialGenerator,
+ PropensitiesFunctor> Solver;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n"
+ << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsDirect2DSearch.cc b/src/solvers/HomogeneousHistogramsDirect2DSearch.cc
new file mode 100644
index 0000000..822fbcc
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsDirect2DSearch.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramsDirect_ipp__
+#include "HomogeneousHistogramsDirect.ipp"
+#undef __HomogeneousHistogramsDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramsDirect2DSearch.d b/src/solvers/HomogeneousHistogramsDirect2DSearch.d
new file mode 100644
index 0000000..68f9038
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsDirect2DSearch.d
@@ -0,0 +1,43 @@
+HomogeneousHistogramsDirect2DSearch.o HomogeneousHistogramsDirect2DSearch.d : \
+ HomogeneousHistogramsDirect2DSearch.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsDirect.ipp ../stochastic/HistogramsDirect.h \
+ ../stochastic/HistogramsBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsDirectTree.cc b/src/solvers/HomogeneousHistogramsDirectTree.cc
new file mode 100644
index 0000000..e3af568
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsDirectTree.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramsDirectTree_ipp__
+#include "HomogeneousHistogramsDirectTree.ipp"
+#undef __HomogeneousHistogramsDirectTree_ipp__
diff --git a/src/solvers/HomogeneousHistogramsDirectTree.d b/src/solvers/HomogeneousHistogramsDirectTree.d
new file mode 100644
index 0000000..d56abd2
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsDirectTree.d
@@ -0,0 +1,42 @@
+HomogeneousHistogramsDirectTree.o HomogeneousHistogramsDirectTree.d : HomogeneousHistogramsDirectTree.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsDirectTree.ipp \
+ ../stochastic/HistogramsDirectTree.h ../stochastic/HistogramsBase.h \
+ ../stochastic/Direct.h ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsDirectTree.ipp b/src/solvers/HomogeneousHistogramsDirectTree.ipp
new file mode 100644
index 0000000..e722f33
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsDirectTree.ipp
@@ -0,0 +1,197 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsDirectTree_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramsDirectTree.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramsDirectTree
+ <DiscreteGenerator, ExponentialGenerator, PropensitiesFunctor> Solver;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // The initial time multiplicity.
+ std::size_t multiplicity = std::size_t(solverParameters[0]);
+ // CONTINUE
+ assert(multiplicity > 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+ // CONTINUE
+ assert(frameTimes.size() == 1);
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, multiplicity, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n"
+ << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsMultiTimeDirect.ipp b/src/solvers/HomogeneousHistogramsMultiTimeDirect.ipp
new file mode 100644
index 0000000..566af43
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsMultiTimeDirect.ipp
@@ -0,0 +1,195 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsMultiTimeDirect_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HistogramsMultiTimeDirect.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::HistogramsMultiTimeDirect
+ <DiscreteGenerator, ExponentialGenerator, PropensitiesFunctor> Solver;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // The time multiplicity.
+ const std::size_t multiplicity = std::size_t(solverParameters[0]);
+ // CONTINUE
+ assert(multiplicity > 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, multiplicity, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n"
+ << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsMultiTimeDirect2DSearch.cc b/src/solvers/HomogeneousHistogramsMultiTimeDirect2DSearch.cc
new file mode 100644
index 0000000..e19c889
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsMultiTimeDirect2DSearch.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#define __HomogeneousHistogramsMultiTimeDirect_ipp__
+#include "HomogeneousHistogramsMultiTimeDirect.ipp"
+#undef __HomogeneousHistogramsMultiTimeDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramsMultiTimeDirect2DSearch.d b/src/solvers/HomogeneousHistogramsMultiTimeDirect2DSearch.d
new file mode 100644
index 0000000..0ca9bd4
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsMultiTimeDirect2DSearch.d
@@ -0,0 +1,44 @@
+HomogeneousHistogramsMultiTimeDirect2DSearch.o HomogeneousHistogramsMultiTimeDirect2DSearch.d : \
+ HomogeneousHistogramsMultiTimeDirect2DSearch.cc \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../numerical/random/exponential/../uniform/Default.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsMultiTimeDirect.ipp \
+ ../stochastic/HistogramsMultiTimeDirect.h \
+ ../stochastic/HistogramsBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsTransientDirect.ipp b/src/solvers/HomogeneousHistogramsTransientDirect.ipp
new file mode 100644
index 0000000..6dc4b7b
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirect.ipp
@@ -0,0 +1,184 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHistogramsTransientDirect_ipp__
+#error This file is an implementation detail.
+#endif
+
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+#ifdef STOCHASTIC_SOLVER_PARAMETER
+ assert(solverParameters.size() == 1);
+#else
+ assert(solverParameters.size() == 0);
+#endif
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+
+ //
+ // Construct the simulation class.
+ //
+#ifdef STOCHASTIC_SOLVER_PARAMETER
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, maximumAllowedSteps,
+ solverParameters[0]);
+#else
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, maximumAllowedSteps);
+#endif
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+#ifdef STOCHASTIC_USE_INFLUENCE_IN_GENERATOR
+ solver.getDiscreteGenerator().setInfluence(&reactionInfluence);
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n"
+ << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLast.cc b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLast.cc
new file mode 100644
index 0000000..d58fce6
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLast.cc
@@ -0,0 +1,25 @@
+// -*- C++ -*-
+
+#include "stochastic/HomogeneousHistogramsTransientDirectTreeExponentialLast.h"
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+// If we use the reaction influence array, we will compute the propensities
+// one at a time.
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+typedef stochastic::HomogeneousHistogramsTransientDirectTreeExponentialLast
+<DiscreteGenerator, ExponentialGenerator, PropensitiesFunctor> Solver;
+
+#define __HomogeneousHistogramsTransientDirect_ipp__
+#include "HomogeneousHistogramsTransientDirect.ipp"
+#undef __HomogeneousHistogramsTransientDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLast.d b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLast.d
new file mode 100644
index 0000000..4930703
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLast.d
@@ -0,0 +1,44 @@
+HomogeneousHistogramsTransientDirectTreeExponentialLast.o HomogeneousHistogramsTransientDirectTreeExponentialLast.d : \
+ HomogeneousHistogramsTransientDirectTreeExponentialLast.cc \
+ ../stochastic/HomogeneousHistogramsTransientDirectTreeExponentialLast.h \
+ ../stochastic/HistogramsBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsTransientDirect.ipp \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLimit.cc b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLimit.cc
new file mode 100644
index 0000000..ef78a40
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLimit.cc
@@ -0,0 +1,25 @@
+// -*- C++ -*-
+
+#include "stochastic/HomogeneousHistogramsTransientDirectTreeExponentialLimit.h"
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+// If we use the reaction influence array, we will compute the propensities
+// one at a time.
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+typedef stochastic::HomogeneousHistogramsTransientDirectTreeExponentialLimit
+<DiscreteGenerator, ExponentialGenerator, PropensitiesFunctor> Solver;
+
+#define __HomogeneousHistogramsTransientDirect_ipp__
+#include "HomogeneousHistogramsTransientDirect.ipp"
+#undef __HomogeneousHistogramsTransientDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLimit.d b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLimit.d
new file mode 100644
index 0000000..ae6cda7
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeExponentialLimit.d
@@ -0,0 +1,44 @@
+HomogeneousHistogramsTransientDirectTreeExponentialLimit.o HomogeneousHistogramsTransientDirectTreeExponentialLimit.d : \
+ HomogeneousHistogramsTransientDirectTreeExponentialLimit.cc \
+ ../stochastic/HomogeneousHistogramsTransientDirectTreeExponentialLimit.h \
+ ../stochastic/HistogramsBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsTransientDirect.ipp \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.cc b/src/solvers/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.cc
new file mode 100644
index 0000000..00a70a1
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.cc
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+
+#include "stochastic/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.h"
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+// If we use the reaction influence array, we will compute the propensities
+// one at a time.
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+typedef stochastic::HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit
+<DiscreteGenerator, ExponentialGenerator, PropensitiesFunctor> Solver;
+
+#define STOCHASTIC_SOLVER_PARAMETER
+#define __HomogeneousHistogramsTransientDirect_ipp__
+#include "HomogeneousHistogramsTransientDirect.ipp"
+#undef __HomogeneousHistogramsTransientDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.d b/src/solvers/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.d
new file mode 100644
index 0000000..e67415e
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.d
@@ -0,0 +1,45 @@
+HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.o HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.d : \
+ HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.cc \
+ ../stochastic/HomogeneousHistogramsTransientDirectTreeHypoexponentialLimit.h \
+ ../stochastic/HistogramsBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../stochastic/../numerical/random/hypoexponential/HypoexponentialDistributionDistinctDynamicMinimumParameters.h \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsTransientDirect.ipp \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeNormalApproximation.cc b/src/solvers/HomogeneousHistogramsTransientDirectTreeNormalApproximation.cc
new file mode 100644
index 0000000..d512dc8
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeNormalApproximation.cc
@@ -0,0 +1,26 @@
+// -*- C++ -*-
+
+#include "stochastic/HomogeneousHistogramsTransientDirectTreeNormalApproximation.h"
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+typedef numerical::DiscreteGenerator2DSearch<> DiscreteGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+typedef Propensities<true> PropensitiesFunctor;
+#else
+// If we use the reaction influence array, we will compute the propensities
+// one at a time.
+typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+typedef stochastic::HomogeneousHistogramsTransientDirectTreeNormalApproximation
+<DiscreteGenerator, ExponentialGenerator, PropensitiesFunctor> Solver;
+
+#define STOCHASTIC_SOLVER_PARAMETER
+#define __HomogeneousHistogramsTransientDirect_ipp__
+#include "HomogeneousHistogramsTransientDirect.ipp"
+#undef __HomogeneousHistogramsTransientDirect_ipp__
diff --git a/src/solvers/HomogeneousHistogramsTransientDirectTreeNormalApproximation.d b/src/solvers/HomogeneousHistogramsTransientDirectTreeNormalApproximation.d
new file mode 100644
index 0000000..916bc23
--- /dev/null
+++ b/src/solvers/HomogeneousHistogramsTransientDirectTreeNormalApproximation.d
@@ -0,0 +1,45 @@
+HomogeneousHistogramsTransientDirectTreeNormalApproximation.o HomogeneousHistogramsTransientDirectTreeNormalApproximation.d : \
+ HomogeneousHistogramsTransientDirectTreeNormalApproximation.cc \
+ ../stochastic/HomogeneousHistogramsTransientDirectTreeNormalApproximation.h \
+ ../stochastic/HistogramsBase.h ../stochastic/Direct.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/Direct.ipp ../stochastic/HistogramsPackedArray.h \
+ ../stochastic/HistogramsPacked.h ../stochastic/HistogramReference.h \
+ ../stochastic/../numerical/random/hypoexponential/HypoexponentialDistributionNormalApproximation.h \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearch.h \
+ ../numerical/random/discrete/DiscreteGenerator2DSearchStatic.h \
+ ../numerical/random/discrete/DgPmf.h \
+ ../numerical/random/discrete/../../../ext/vector.h \
+ ../numerical/random/discrete/linearSearch.h \
+ ../numerical/random/discrete/../../../loki/static_check.h \
+ ../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../numerical/random/discrete/linearSearch.ipp \
+ ../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ HomogeneousHistogramsTransientDirect.ipp \
+ ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHybridDirectTauLeaping.ipp b/src/solvers/HomogeneousHybridDirectTauLeaping.ipp
new file mode 100644
index 0000000..5d49c5e
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeaping.ipp
@@ -0,0 +1,181 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousHybridDirectTauLeaping_ipp__
+#error This file is an implementation detail.
+#endif
+
+// CONTINUE
+// 30% improvement.
+//#define NUMERICAL_POISSON_HERMITE_APPROXIMATION
+// 10% improvement.
+//#define NUMERICAL_POISSON_STORE_INVERSE
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/HybridDirectTauLeaping.h"
+
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef stochastic::HybridDirectTauLeaping<Propensities<true> >
+ HybridDirectTauLeaping;
+#else
+ typedef stochastic::HybridDirectTauLeaping<> HybridDirectTauLeaping;
+#endif
+ typedef HybridDirectTauLeaping::PropensitiesFunctor PropensitiesFunctor;
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ HybridDirectTauLeaping
+ solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), solverParameters[0],
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ double directSteps = 0, tauLeapingSteps = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+#ifdef FORWARD
+ solver.simulateForward(frameTimes[i]);
+#elif defined MIDPOINT
+ solver.simulateMidpoint(frameTimes[i]);
+#else
+ solver.simulateRungeKutta4(frameTimes[i]);
+#endif
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ totalReactionCount += solver.getState().getReactionCount();
+ directSteps += solver.getDirectCount();
+ tauLeapingSteps += solver.getTauLeapingCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Reaction count: " << totalReactionCount << '\n'
+ << "Direct step count: " << directSteps << '\n'
+ << "Tau-leaping step count: " << tauLeapingSteps << '\n';
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousHybridDirectTauLeapingForward.cc b/src/solvers/HomogeneousHybridDirectTauLeapingForward.cc
new file mode 100644
index 0000000..6fa6a9b
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeapingForward.cc
@@ -0,0 +1,7 @@
+// -*- C++ -*-
+
+#define FORWARD
+
+#define __HomogeneousHybridDirectTauLeaping_ipp__
+#include "HomogeneousHybridDirectTauLeaping.ipp"
+#undef __HomogeneousHybridDirectTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousHybridDirectTauLeapingForward.d b/src/solvers/HomogeneousHybridDirectTauLeapingForward.d
new file mode 100644
index 0000000..32317c9
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeapingForward.d
@@ -0,0 +1,51 @@
+HomogeneousHybridDirectTauLeapingForward.o HomogeneousHybridDirectTauLeapingForward.d : \
+ HomogeneousHybridDirectTauLeapingForward.cc \
+ HomogeneousHybridDirectTauLeaping.ipp \
+ ../stochastic/HybridDirectTauLeaping.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TauLeapingDynamic.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../uniform/Default.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeapingDynamic.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/../numerical/random/discrete/DiscreteGeneratorDynamic.h \
+ ../stochastic/../numerical/random/discrete/linearSearch.h \
+ ../stochastic/../numerical/random/discrete/../../../loki/static_check.h \
+ ../stochastic/../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../stochastic/../numerical/random/discrete/linearSearch.ipp \
+ ../stochastic/../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/discrete/../../../ext/vector.h \
+ ../stochastic/HybridDirectTauLeaping.ipp \
+ ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHybridDirectTauLeapingMidpoint.cc b/src/solvers/HomogeneousHybridDirectTauLeapingMidpoint.cc
new file mode 100644
index 0000000..ee8c8e6
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeapingMidpoint.cc
@@ -0,0 +1,7 @@
+// -*- C++ -*-
+
+#define MIDPOINT
+
+#define __HomogeneousHybridDirectTauLeaping_ipp__
+#include "HomogeneousHybridDirectTauLeaping.ipp"
+#undef __HomogeneousHybridDirectTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousHybridDirectTauLeapingMidpoint.d b/src/solvers/HomogeneousHybridDirectTauLeapingMidpoint.d
new file mode 100644
index 0000000..ea35723
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeapingMidpoint.d
@@ -0,0 +1,51 @@
+HomogeneousHybridDirectTauLeapingMidpoint.o HomogeneousHybridDirectTauLeapingMidpoint.d : \
+ HomogeneousHybridDirectTauLeapingMidpoint.cc \
+ HomogeneousHybridDirectTauLeaping.ipp \
+ ../stochastic/HybridDirectTauLeaping.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TauLeapingDynamic.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../uniform/Default.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeapingDynamic.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/../numerical/random/discrete/DiscreteGeneratorDynamic.h \
+ ../stochastic/../numerical/random/discrete/linearSearch.h \
+ ../stochastic/../numerical/random/discrete/../../../loki/static_check.h \
+ ../stochastic/../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../stochastic/../numerical/random/discrete/linearSearch.ipp \
+ ../stochastic/../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/discrete/../../../ext/vector.h \
+ ../stochastic/HybridDirectTauLeaping.ipp \
+ ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousHybridDirectTauLeapingRungeKutta4.cc b/src/solvers/HomogeneousHybridDirectTauLeapingRungeKutta4.cc
new file mode 100644
index 0000000..1b4f8fd
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeapingRungeKutta4.cc
@@ -0,0 +1,7 @@
+// -*- C++ -*-
+
+#define RUNGE_KUTTA_4
+
+#define __HomogeneousHybridDirectTauLeaping_ipp__
+#include "HomogeneousHybridDirectTauLeaping.ipp"
+#undef __HomogeneousHybridDirectTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousHybridDirectTauLeapingRungeKutta4.d b/src/solvers/HomogeneousHybridDirectTauLeapingRungeKutta4.d
new file mode 100644
index 0000000..1ccc8bf
--- /dev/null
+++ b/src/solvers/HomogeneousHybridDirectTauLeapingRungeKutta4.d
@@ -0,0 +1,51 @@
+HomogeneousHybridDirectTauLeapingRungeKutta4.o HomogeneousHybridDirectTauLeapingRungeKutta4.d : \
+ HomogeneousHybridDirectTauLeapingRungeKutta4.cc \
+ HomogeneousHybridDirectTauLeaping.ipp \
+ ../stochastic/HybridDirectTauLeaping.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TauLeapingDynamic.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../uniform/Default.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeapingDynamic.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/../numerical/random/discrete/DiscreteGeneratorDynamic.h \
+ ../stochastic/../numerical/random/discrete/linearSearch.h \
+ ../stochastic/../numerical/random/discrete/../../../loki/static_check.h \
+ ../stochastic/../numerical/random/discrete/../../../loki/TypeManip.h \
+ ../stochastic/../numerical/random/discrete/linearSearch.ipp \
+ ../stochastic/../numerical/random/discrete/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/discrete/../../../ext/vector.h \
+ ../stochastic/HybridDirectTauLeaping.ipp \
+ ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReaction.ipp b/src/solvers/HomogeneousNextReaction.ipp
new file mode 100644
index 0000000..5870974
--- /dev/null
+++ b/src/solvers/HomogeneousNextReaction.ipp
@@ -0,0 +1,246 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousNextReaction_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/NextReaction.h"
+#include "stochastic/ReactionPriorityQueue.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::ReactionPriorityQueue<IndexedPriorityQueue>
+ ReactionPriorityQueue;
+ typedef ReactionPriorityQueue::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef stochastic::NextReaction<ReactionPriorityQueue,
+ Propensities<true> > NextReaction;
+#else
+ typedef stochastic::NextReaction<ReactionPriorityQueue> NextReaction;
+#endif
+
+ typedef stochastic::State State;
+ typedef NextReaction::PropensitiesFunctor PropensitiesFunctor;
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Build the array of reaction influences.
+ //
+
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, false);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ DiscreteUniformGenerator discreteUniformGenerator;
+ std::cin >> discreteUniformGenerator;
+
+ //
+ // The reaction priority queue.
+ //
+
+#ifdef HASHING
+ //std::size_t tableSize = std::max(std::size_t(256), 2 * numberOfReactions);
+ std::size_t tableSize = std::min(std::size_t(2048), 4 * numberOfReactions);
+ parser.getOption("table", &tableSize);
+ if (tableSize < 1) {
+ std::cerr << "Bad size for the hash table = " << tableSize << "\n";
+ exitOnError();
+ }
+
+ //double targetLoad = 2;
+ double targetLoad = 8;
+ parser.getOption("load", &targetLoad);
+ if (targetLoad <= 0) {
+ std::cerr << "Bad target load for the hash table = " << targetLoad << "\n";
+ exitOnError();
+ }
+#endif
+
+#ifdef HASHING
+ ReactionPriorityQueue reactionPriorityQueue(numberOfReactions,
+ &discreteUniformGenerator,
+ tableSize, targetLoad);
+#else
+ ReactionPriorityQueue reactionPriorityQueue(numberOfReactions,
+ &discreteUniformGenerator);
+#endif
+
+#ifdef COST_CONSTANT
+ {
+ // The const constant for partitioning methods.
+ double cost;
+ if (parser.getOption("cost", &cost)) {
+ reactionPriorityQueue.setCostConstant(cost);
+ }
+ }
+#endif
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Construct the simulation class.
+ //
+ NextReaction solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), &reactionPriorityQueue,
+ reactionInfluence, maximumAllowedSteps);
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ timer.tic();
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+ solver.simulate(frameTimes[i]);
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Meaningless result = "
+ << discreteUniformGenerator() <<'\n'
+ << "Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousNextReactionBinaryHeapGibsonBruck.cc b/src/solvers/HomogeneousNextReactionBinaryHeapGibsonBruck.cc
new file mode 100644
index 0000000..b11f10a
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionBinaryHeapGibsonBruck.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#define GIBSON_BRUCK_UPDATE
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeapPair.h"
+
+typedef ads::IndexedPriorityQueueBinaryHeapPair<> IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionBinaryHeapGibsonBruck.d b/src/solvers/HomogeneousNextReactionBinaryHeapGibsonBruck.d
new file mode 100644
index 0000000..583510f
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionBinaryHeapGibsonBruck.d
@@ -0,0 +1,37 @@
+HomogeneousNextReactionBinaryHeapGibsonBruck.o HomogeneousNextReactionBinaryHeapGibsonBruck.d : \
+ HomogeneousNextReactionBinaryHeapGibsonBruck.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeapPair.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionBinaryHeapPair.cc b/src/solvers/HomogeneousNextReactionBinaryHeapPair.cc
new file mode 100644
index 0000000..c9364bf
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionBinaryHeapPair.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeapPair.h"
+
+typedef ads::IndexedPriorityQueueBinaryHeapPair<> IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionBinaryHeapPair.d b/src/solvers/HomogeneousNextReactionBinaryHeapPair.d
new file mode 100644
index 0000000..ce272f8
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionBinaryHeapPair.d
@@ -0,0 +1,37 @@
+HomogeneousNextReactionBinaryHeapPair.o HomogeneousNextReactionBinaryHeapPair.d : \
+ HomogeneousNextReactionBinaryHeapPair.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeapPair.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionBinaryHeapPointer.cc b/src/solvers/HomogeneousNextReactionBinaryHeapPointer.cc
new file mode 100644
index 0000000..5aa4e2c
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionBinaryHeapPointer.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h"
+
+typedef ads::IndexedPriorityQueueBinaryHeap<> IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionBinaryHeapPointer.d b/src/solvers/HomogeneousNextReactionBinaryHeapPointer.d
new file mode 100644
index 0000000..0c7a716
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionBinaryHeapPointer.d
@@ -0,0 +1,37 @@
+HomogeneousNextReactionBinaryHeapPointer.o HomogeneousNextReactionBinaryHeapPointer.d : \
+ HomogeneousNextReactionBinaryHeapPointer.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionHashing.cc b/src/solvers/HomogeneousNextReactionHashing.cc
new file mode 100644
index 0000000..07369cb
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashing.cc
@@ -0,0 +1,11 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h"
+
+typedef ads::IndexedPriorityQueueHashing<> IndexedPriorityQueue;
+
+#define HASHING
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionHashing.d b/src/solvers/HomogeneousNextReactionHashing.d
new file mode 100644
index 0000000..988f3d2
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashing.d
@@ -0,0 +1,37 @@
+HomogeneousNextReactionHashing.o HomogeneousNextReactionHashing.d : HomogeneousNextReactionHashing.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h \
+ ../ads/indexedPriorityQueue/HashingChaining.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionHashingGenericList.cc b/src/solvers/HomogeneousNextReactionHashingGenericList.cc
new file mode 100644
index 0000000..bebf985
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashingGenericList.cc
@@ -0,0 +1,15 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h"
+#include "ads/indexedPriorityQueue/HashingChainingGeneric.h"
+#include <list>
+
+typedef std::vector<double>::const_iterator Iterator;
+typedef ads::IndexedPriorityQueueHashing
+<double, ads::HashingChainingGeneric<Iterator, std::list<Iterator> > > IndexedPriorityQueue;
+
+#define HASHING
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionHashingGenericList.d b/src/solvers/HomogeneousNextReactionHashingGenericList.d
new file mode 100644
index 0000000..40b005a
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashingGenericList.d
@@ -0,0 +1,39 @@
+HomogeneousNextReactionHashingGenericList.o HomogeneousNextReactionHashingGenericList.d : \
+ HomogeneousNextReactionHashingGenericList.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h \
+ ../ads/indexedPriorityQueue/HashingChaining.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../ads/indexedPriorityQueue/HashingChainingGeneric.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionHashingGenericVector.cc b/src/solvers/HomogeneousNextReactionHashingGenericVector.cc
new file mode 100644
index 0000000..29c87d8
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashingGenericVector.cc
@@ -0,0 +1,14 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h"
+#include "ads/indexedPriorityQueue/HashingChainingGeneric.h"
+
+typedef std::vector<double>::const_iterator Iterator;
+typedef ads::IndexedPriorityQueueHashing
+<double, ads::HashingChainingGeneric<Iterator> > IndexedPriorityQueue;
+
+#define HASHING
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionHashingGenericVector.d b/src/solvers/HomogeneousNextReactionHashingGenericVector.d
new file mode 100644
index 0000000..1939e52
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashingGenericVector.d
@@ -0,0 +1,39 @@
+HomogeneousNextReactionHashingGenericVector.o HomogeneousNextReactionHashingGenericVector.d : \
+ HomogeneousNextReactionHashingGenericVector.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h \
+ ../ads/indexedPriorityQueue/HashingChaining.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../ads/indexedPriorityQueue/HashingChainingGeneric.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionHashingVector.cc b/src/solvers/HomogeneousNextReactionHashingVector.cc
new file mode 100644
index 0000000..428f448
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashingVector.cc
@@ -0,0 +1,13 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h"
+#include "ads/indexedPriorityQueue/HashingChainingVector.h"
+
+typedef ads::IndexedPriorityQueueHashing
+<double, ads::HashingChainingVector<std::vector<double>::const_iterator> > IndexedPriorityQueue;
+
+#define HASHING
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionHashingVector.d b/src/solvers/HomogeneousNextReactionHashingVector.d
new file mode 100644
index 0000000..e1412d9
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionHashingVector.d
@@ -0,0 +1,39 @@
+HomogeneousNextReactionHashingVector.o HomogeneousNextReactionHashingVector.d : \
+ HomogeneousNextReactionHashingVector.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueHashing.h \
+ ../ads/indexedPriorityQueue/HashingChaining.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../ads/indexedPriorityQueue/HashingChainingVector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionLinearSearch.cc b/src/solvers/HomogeneousNextReactionLinearSearch.cc
new file mode 100644
index 0000000..638814f
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionLinearSearch.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearchSimple.h"
+
+typedef ads::IndexedPriorityQueueLinearSearchSimple<> IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionLinearSearch.d b/src/solvers/HomogeneousNextReactionLinearSearch.d
new file mode 100644
index 0000000..cb656e1
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionLinearSearch.d
@@ -0,0 +1,38 @@
+HomogeneousNextReactionLinearSearch.o HomogeneousNextReactionLinearSearch.d : \
+ HomogeneousNextReactionLinearSearch.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearchSimple.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../ads/indexedPriorityQueue/../../loki/TypeManip.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionLinearSearchPointer.cc b/src/solvers/HomogeneousNextReactionLinearSearchPointer.cc
new file mode 100644
index 0000000..10716e8
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionLinearSearchPointer.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h"
+
+typedef ads::IndexedPriorityQueueLinearSearch<> IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionLinearSearchPointer.d b/src/solvers/HomogeneousNextReactionLinearSearchPointer.d
new file mode 100644
index 0000000..c02dd70
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionLinearSearchPointer.d
@@ -0,0 +1,36 @@
+HomogeneousNextReactionLinearSearchPointer.o HomogeneousNextReactionLinearSearchPointer.d : \
+ HomogeneousNextReactionLinearSearchPointer.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionLinearSearchUnrolled.cc b/src/solvers/HomogeneousNextReactionLinearSearchUnrolled.cc
new file mode 100644
index 0000000..6b86d34
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionLinearSearchUnrolled.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearchUnrolled.h"
+
+typedef ads::IndexedPriorityQueueLinearSearchUnrolled<> IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionLinearSearchUnrolled.d b/src/solvers/HomogeneousNextReactionLinearSearchUnrolled.d
new file mode 100644
index 0000000..81aecf8
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionLinearSearchUnrolled.d
@@ -0,0 +1,39 @@
+HomogeneousNextReactionLinearSearchUnrolled.o HomogeneousNextReactionLinearSearchUnrolled.d : \
+ HomogeneousNextReactionLinearSearchUnrolled.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearchUnrolled.h \
+ ../ads/indexedPriorityQueue/../algorithm/extremeElement.h \
+ ../ads/indexedPriorityQueue/../algorithm/extremeElement.ipp \
+ ../ads/indexedPriorityQueue/../../loki/TypeManip.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionPartitionCostAdaptive.cc b/src/solvers/HomogeneousNextReactionPartitionCostAdaptive.cc
new file mode 100644
index 0000000..120216c
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionCostAdaptive.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchCostAdaptive.h"
+
+typedef ads::IndexedPriorityQueuePartitionLinearSearchCostAdaptive<>
+IndexedPriorityQueue;
+
+#define COST_CONSTANT
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionPartitionCostAdaptive.d b/src/solvers/HomogeneousNextReactionPartitionCostAdaptive.d
new file mode 100644
index 0000000..9a69698
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionCostAdaptive.d
@@ -0,0 +1,38 @@
+HomogeneousNextReactionPartitionCostAdaptive.o HomogeneousNextReactionPartitionCostAdaptive.d : \
+ HomogeneousNextReactionPartitionCostAdaptive.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchCostAdaptive.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearch.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionPartitionFixedSize.cc b/src/solvers/HomogeneousNextReactionPartitionFixedSize.cc
new file mode 100644
index 0000000..c1f3a6a
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionFixedSize.cc
@@ -0,0 +1,10 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchFixedSize.h"
+
+typedef ads::IndexedPriorityQueuePartitionLinearSearchFixedSize<>
+IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionPartitionFixedSize.d b/src/solvers/HomogeneousNextReactionPartitionFixedSize.d
new file mode 100644
index 0000000..082a67e
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionFixedSize.d
@@ -0,0 +1,38 @@
+HomogeneousNextReactionPartitionFixedSize.o HomogeneousNextReactionPartitionFixedSize.d : \
+ HomogeneousNextReactionPartitionFixedSize.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchFixedSize.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearch.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionPartitionPropensities.cc b/src/solvers/HomogeneousNextReactionPartitionPropensities.cc
new file mode 100644
index 0000000..856536e
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionPropensities.cc
@@ -0,0 +1,10 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchPropensities.h"
+
+typedef ads::IndexedPriorityQueuePartitionLinearSearchPropensities<>
+IndexedPriorityQueue;
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionPartitionPropensities.d b/src/solvers/HomogeneousNextReactionPartitionPropensities.d
new file mode 100644
index 0000000..43d67ed
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionPropensities.d
@@ -0,0 +1,38 @@
+HomogeneousNextReactionPartitionPropensities.o HomogeneousNextReactionPartitionPropensities.d : \
+ HomogeneousNextReactionPartitionPropensities.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchPropensities.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearch.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousNextReactionPartitionSizeAdaptive.cc b/src/solvers/HomogeneousNextReactionPartitionSizeAdaptive.cc
new file mode 100644
index 0000000..711b2cd
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionSizeAdaptive.cc
@@ -0,0 +1,12 @@
+// -*- C++ -*-
+
+#include "ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchSizeAdaptive.h"
+
+typedef ads::IndexedPriorityQueuePartitionLinearSearchSizeAdaptive<>
+IndexedPriorityQueue;
+
+#define COST_CONSTANT
+
+#define __HomogeneousNextReaction_ipp__
+#include "HomogeneousNextReaction.ipp"
+#undef __HomogeneousNextReaction_ipp__
diff --git a/src/solvers/HomogeneousNextReactionPartitionSizeAdaptive.d b/src/solvers/HomogeneousNextReactionPartitionSizeAdaptive.d
new file mode 100644
index 0000000..7484168
--- /dev/null
+++ b/src/solvers/HomogeneousNextReactionPartitionSizeAdaptive.d
@@ -0,0 +1,38 @@
+HomogeneousNextReactionPartitionSizeAdaptive.o HomogeneousNextReactionPartitionSizeAdaptive.d : \
+ HomogeneousNextReactionPartitionSizeAdaptive.cc \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearchSizeAdaptive.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueuePartitionLinearSearch.h \
+ ../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../ads/indexedPriorityQueue/../../ext/vector.h \
+ HomogeneousNextReaction.ipp ../stochastic/NextReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/TimeEpochOffset.h ../stochastic/NextReaction.ipp \
+ ../stochastic/ReactionPriorityQueue.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueLinearSearch.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../numerical/random/exponential/Default.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousOdeReaction.ipp b/src/solvers/HomogeneousOdeReaction.ipp
new file mode 100644
index 0000000..c316e49
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReaction.ipp
@@ -0,0 +1,215 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousOdeReaction_ipp__
+#error This file is an implementation detail.
+#endif
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#else
+#include "stochastic/Propensities.h"
+#endif
+
+#include "stochastic/OdeReaction.h"
+
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+#include <limits>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::State State;
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef stochastic::OdeReaction<false, Propensities<false> > OdeReaction;
+#else
+ typedef stochastic::OdeReaction<false,
+ stochastic::PropensitiesSingle<false/*IsDiscrete*/> > OdeReaction;
+#endif
+ typedef OdeReaction::PropensitiesFunctor PropensitiesFunctor;
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ OdeReaction solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), maximumAllowedSteps);
+
+ //
+ // Run the simulation.
+ //
+
+#ifdef FIXED
+#ifdef FORWARD
+ solver.setupFixedForward();
+#elif defined MIDPOINT
+ solver.setupFixedMidpoint();
+#elif defined RUNGE_KUTTA_4
+ solver.setupFixedRungeKutta4();
+#elif defined RUNGE_KUTTA_CASH_KARP
+ solver.setupFixedRungeKuttaCashKarp();
+#else
+#error Bad Method
+#endif
+#else
+#ifdef RUNGE_KUTTA_CASH_KARP
+ solver.setupRungeKuttaCashKarp();
+#else
+#error Bad Method
+#endif
+#endif
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ double totalSteps = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ populations.clear();
+ reactionCounts.clear();
+ // Blank line for the MT 19937 state.
+ std::cout << '\n';
+
+ bool success = true;
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+#ifdef FIXED
+#ifdef FORWARD
+ success = solver.simulateFixedForward(solverParameters[0],
+ frameTimes[i]);
+#elif defined MIDPOINT
+ success = solver.simulateFixedMidpoint(solverParameters[0],
+ frameTimes[i]);
+#elif defined RUNGE_KUTTA_4
+ success = solver.simulateFixedRungeKutta4(solverParameters[0],
+ frameTimes[i]);
+#elif defined RUNGE_KUTTA_CASH_KARP
+ success = solver.simulateFixedRungeKuttaCashKarp(solverParameters[0],
+ frameTimes[i]);
+#else
+#error Bad Method
+#endif
+#else
+#ifdef RUNGE_KUTTA_CASH_KARP
+ success = solver.simulateRungeKuttaCashKarp(solverParameters[0],
+ frameTimes[i]);
+#else
+#error Bad Method
+#endif
+#endif
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ if (! success) {
+ break;
+ }
+ }
+ totalReactionCount += solver.getState().getReactionCount();
+ totalSteps += solver.getStepCount();
+ if (success) {
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ else {
+ // Error message.
+ std::cout << solver.getError();
+ const std::vector<double>& populations =
+ solver.getState().getPopulations();
+ for (std::size_t n = 0; n != populations.size(); ++n) {
+ if (populations[n] < 0) {
+ std::cout << " Species " << n + 1
+ << " has the negative population " << populations[n]
+ << ".";
+ }
+ }
+ std::cout << '\n';
+ }
+ }
+ // Blank line for the final MT 19937 state.
+ std::cout << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Reaction count: " << totalReactionCount << '\n'
+ << "Step count: " << totalSteps << '\n';
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousOdeReactionFixedForward.cc b/src/solvers/HomogeneousOdeReactionFixedForward.cc
new file mode 100644
index 0000000..e5c8bef
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedForward.cc
@@ -0,0 +1,8 @@
+// -*- C++ -*-
+
+#define FIXED
+#define FORWARD
+
+#define __HomogeneousOdeReaction_ipp__
+#include "HomogeneousOdeReaction.ipp"
+#undef __HomogeneousOdeReaction_ipp__
diff --git a/src/solvers/HomogeneousOdeReactionFixedForward.d b/src/solvers/HomogeneousOdeReactionFixedForward.d
new file mode 100644
index 0000000..e884b18
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedForward.d
@@ -0,0 +1,19 @@
+HomogeneousOdeReactionFixedForward.o HomogeneousOdeReactionFixedForward.d : \
+ HomogeneousOdeReactionFixedForward.cc HomogeneousOdeReaction.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp ../stochastic/../ext/vector.h \
+ ../stochastic/../loki/TypeManip.h ../stochastic/Reaction.ipp \
+ ../stochastic/ReactionSet.ipp ../stochastic/OdeReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp ../stochastic/State.ipp \
+ ../stochastic/OdeReaction.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousOdeReactionFixedMidpoint.cc b/src/solvers/HomogeneousOdeReactionFixedMidpoint.cc
new file mode 100644
index 0000000..236d2e8
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedMidpoint.cc
@@ -0,0 +1,8 @@
+// -*- C++ -*-
+
+#define FIXED
+#define MIDPOINT
+
+#define __HomogeneousOdeReaction_ipp__
+#include "HomogeneousOdeReaction.ipp"
+#undef __HomogeneousOdeReaction_ipp__
diff --git a/src/solvers/HomogeneousOdeReactionFixedMidpoint.d b/src/solvers/HomogeneousOdeReactionFixedMidpoint.d
new file mode 100644
index 0000000..1fa35df
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedMidpoint.d
@@ -0,0 +1,19 @@
+HomogeneousOdeReactionFixedMidpoint.o HomogeneousOdeReactionFixedMidpoint.d : \
+ HomogeneousOdeReactionFixedMidpoint.cc HomogeneousOdeReaction.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp ../stochastic/../ext/vector.h \
+ ../stochastic/../loki/TypeManip.h ../stochastic/Reaction.ipp \
+ ../stochastic/ReactionSet.ipp ../stochastic/OdeReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp ../stochastic/State.ipp \
+ ../stochastic/OdeReaction.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousOdeReactionFixedRungeKutta4.cc b/src/solvers/HomogeneousOdeReactionFixedRungeKutta4.cc
new file mode 100644
index 0000000..635e31f
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedRungeKutta4.cc
@@ -0,0 +1,8 @@
+// -*- C++ -*-
+
+#define FIXED
+#define RUNGE_KUTTA_4
+
+#define __HomogeneousOdeReaction_ipp__
+#include "HomogeneousOdeReaction.ipp"
+#undef __HomogeneousOdeReaction_ipp__
diff --git a/src/solvers/HomogeneousOdeReactionFixedRungeKutta4.d b/src/solvers/HomogeneousOdeReactionFixedRungeKutta4.d
new file mode 100644
index 0000000..a5e80bc
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedRungeKutta4.d
@@ -0,0 +1,19 @@
+HomogeneousOdeReactionFixedRungeKutta4.o HomogeneousOdeReactionFixedRungeKutta4.d : \
+ HomogeneousOdeReactionFixedRungeKutta4.cc HomogeneousOdeReaction.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp ../stochastic/../ext/vector.h \
+ ../stochastic/../loki/TypeManip.h ../stochastic/Reaction.ipp \
+ ../stochastic/ReactionSet.ipp ../stochastic/OdeReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp ../stochastic/State.ipp \
+ ../stochastic/OdeReaction.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousOdeReactionFixedRungeKuttaCashKarp.cc b/src/solvers/HomogeneousOdeReactionFixedRungeKuttaCashKarp.cc
new file mode 100644
index 0000000..3d9763c
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedRungeKuttaCashKarp.cc
@@ -0,0 +1,8 @@
+// -*- C++ -*-
+
+#define FIXED
+#define RUNGE_KUTTA_CASH_KARP
+
+#define __HomogeneousOdeReaction_ipp__
+#include "HomogeneousOdeReaction.ipp"
+#undef __HomogeneousOdeReaction_ipp__
diff --git a/src/solvers/HomogeneousOdeReactionFixedRungeKuttaCashKarp.d b/src/solvers/HomogeneousOdeReactionFixedRungeKuttaCashKarp.d
new file mode 100644
index 0000000..aa520f5
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionFixedRungeKuttaCashKarp.d
@@ -0,0 +1,20 @@
+HomogeneousOdeReactionFixedRungeKuttaCashKarp.o HomogeneousOdeReactionFixedRungeKuttaCashKarp.d : \
+ HomogeneousOdeReactionFixedRungeKuttaCashKarp.cc \
+ HomogeneousOdeReaction.ipp ../stochastic/Propensities.h \
+ ../stochastic/ReactionSet.h ../stochastic/Reaction.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp ../stochastic/../ext/vector.h \
+ ../stochastic/../loki/TypeManip.h ../stochastic/Reaction.ipp \
+ ../stochastic/ReactionSet.ipp ../stochastic/OdeReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp ../stochastic/State.ipp \
+ ../stochastic/OdeReaction.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousOdeReactionRungeKuttaCashKarp.cc b/src/solvers/HomogeneousOdeReactionRungeKuttaCashKarp.cc
new file mode 100644
index 0000000..372d761
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionRungeKuttaCashKarp.cc
@@ -0,0 +1,7 @@
+// -*- C++ -*-
+
+#define RUNGE_KUTTA_CASH_KARP
+
+#define __HomogeneousOdeReaction_ipp__
+#include "HomogeneousOdeReaction.ipp"
+#undef __HomogeneousOdeReaction_ipp__
diff --git a/src/solvers/HomogeneousOdeReactionRungeKuttaCashKarp.d b/src/solvers/HomogeneousOdeReactionRungeKuttaCashKarp.d
new file mode 100644
index 0000000..aa2f2ad
--- /dev/null
+++ b/src/solvers/HomogeneousOdeReactionRungeKuttaCashKarp.d
@@ -0,0 +1,19 @@
+HomogeneousOdeReactionRungeKuttaCashKarp.o HomogeneousOdeReactionRungeKuttaCashKarp.d : \
+ HomogeneousOdeReactionRungeKuttaCashKarp.cc HomogeneousOdeReaction.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp ../stochastic/../ext/vector.h \
+ ../stochastic/../loki/TypeManip.h ../stochastic/Reaction.ipp \
+ ../stochastic/ReactionSet.ipp ../stochastic/OdeReaction.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp ../stochastic/State.ipp \
+ ../stochastic/OdeReaction.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeaping.ipp b/src/solvers/HomogeneousTauLeaping.ipp
new file mode 100644
index 0000000..c95cae4
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeaping.ipp
@@ -0,0 +1,188 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousTauLeaping_ipp__
+#error This file is an implementation detail.
+#endif
+
+// CONTINUE
+// 30% improvement.
+//#define NUMERICAL_POISSON_HERMITE_APPROXIMATION
+// 10% improvement.
+//#define NUMERICAL_POISSON_STORE_INVERSE
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/TauLeaping.h"
+
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::State State;
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::TauLeaping<PropensitiesFunctor,
+ CorrectNegativePopulations> TauLeaping;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ TauLeaping solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double>
+ reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ double totalSteps = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+#ifdef FIXED
+#ifdef FORWARD
+ solver.simulateFixedForward(solverParameters[0], frameTimes[i]);
+#elif defined MIDPOINT
+ solver.simulateFixedMidpoint(solverParameters[0], frameTimes[i]);
+#else
+ solver.simulateFixedRungeKutta4(solverParameters[0], frameTimes[i]);
+#endif
+#else
+#ifdef FORWARD
+ solver.simulateForward(solverParameters[0], frameTimes[i]);
+#elif defined MIDPOINT
+ solver.simulateMidpoint(solverParameters[0], frameTimes[i]);
+#else
+ solver.simulateRungeKutta4(solverParameters[0], frameTimes[i]);
+#endif
+#endif
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ totalReactionCount += solver.getState().getReactionCount();
+ totalSteps += solver.getStepCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Reaction count: " << totalReactionCount << '\n'
+ << "Step count: " << totalSteps << '\n';
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousTauLeapingFixedForward.cc b/src/solvers/HomogeneousTauLeapingFixedForward.cc
new file mode 100644
index 0000000..e408a96
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingFixedForward.cc
@@ -0,0 +1,10 @@
+// -*- C++ -*-
+
+#define FIXED
+#define FORWARD
+
+const bool CorrectNegativePopulations = false;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingFixedForward.d b/src/solvers/HomogeneousTauLeapingFixedForward.d
new file mode 100644
index 0000000..a682091
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingFixedForward.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingFixedForward.o HomogeneousTauLeapingFixedForward.d : \
+ HomogeneousTauLeapingFixedForward.cc HomogeneousTauLeaping.ipp \
+ ../stochastic/TauLeaping.h ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingFixedMidpoint.cc b/src/solvers/HomogeneousTauLeapingFixedMidpoint.cc
new file mode 100644
index 0000000..6eb54da
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingFixedMidpoint.cc
@@ -0,0 +1,10 @@
+// -*- C++ -*-
+
+#define FIXED
+#define MIDPOINT
+
+const bool CorrectNegativePopulations = false;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingFixedMidpoint.d b/src/solvers/HomogeneousTauLeapingFixedMidpoint.d
new file mode 100644
index 0000000..87980ca
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingFixedMidpoint.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingFixedMidpoint.o HomogeneousTauLeapingFixedMidpoint.d : \
+ HomogeneousTauLeapingFixedMidpoint.cc HomogeneousTauLeaping.ipp \
+ ../stochastic/TauLeaping.h ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingFixedRungeKutta4.cc b/src/solvers/HomogeneousTauLeapingFixedRungeKutta4.cc
new file mode 100644
index 0000000..f523eaa
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingFixedRungeKutta4.cc
@@ -0,0 +1,10 @@
+// -*- C++ -*-
+
+#define FIXED
+#define RUNGE_KUTTA_4
+
+const bool CorrectNegativePopulations = false;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingFixedRungeKutta4.d b/src/solvers/HomogeneousTauLeapingFixedRungeKutta4.d
new file mode 100644
index 0000000..79a7670
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingFixedRungeKutta4.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingFixedRungeKutta4.o HomogeneousTauLeapingFixedRungeKutta4.d : \
+ HomogeneousTauLeapingFixedRungeKutta4.cc HomogeneousTauLeaping.ipp \
+ ../stochastic/TauLeaping.h ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingForward.cc b/src/solvers/HomogeneousTauLeapingForward.cc
new file mode 100644
index 0000000..2d9491d
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingForward.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#define FORWARD
+
+const bool CorrectNegativePopulations = true;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingForward.d b/src/solvers/HomogeneousTauLeapingForward.d
new file mode 100644
index 0000000..e220640
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingForward.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingForward.o HomogeneousTauLeapingForward.d : HomogeneousTauLeapingForward.cc \
+ HomogeneousTauLeaping.ipp ../stochastic/TauLeaping.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingForwardNoCorrection.cc b/src/solvers/HomogeneousTauLeapingForwardNoCorrection.cc
new file mode 100644
index 0000000..aeb6e7f
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingForwardNoCorrection.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#define FORWARD
+
+const bool CorrectNegativePopulations = false;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingForwardNoCorrection.d b/src/solvers/HomogeneousTauLeapingForwardNoCorrection.d
new file mode 100644
index 0000000..2b430ee
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingForwardNoCorrection.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingForwardNoCorrection.o HomogeneousTauLeapingForwardNoCorrection.d : \
+ HomogeneousTauLeapingForwardNoCorrection.cc HomogeneousTauLeaping.ipp \
+ ../stochastic/TauLeaping.h ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingImplicit.ipp b/src/solvers/HomogeneousTauLeapingImplicit.ipp
new file mode 100644
index 0000000..76a0799
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingImplicit.ipp
@@ -0,0 +1,160 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousTauLeapingImplicit_ipp__
+#error This file is an implementation detail.
+#endif
+
+#include "stochastic/TauLeapingImplicit.h"
+
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::TauLeapingImplicit Solver;
+ typedef stochastic::State State;
+ typedef Solver::PropensitiesFunctor PropensitiesFunctor;
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ double totalSteps = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+#ifdef EULER
+ solver.simulateFixedEuler(solverParameters[0], frameTimes[i]);
+#else
+#error "Undefined method."
+#endif
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ totalReactionCount += solver.getState().getReactionCount();
+ totalSteps += solver.getStepCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Reaction count: " << totalReactionCount << '\n'
+ << "Step count: " << totalSteps << '\n';
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousTauLeapingImplicitFixedEuler.cc b/src/solvers/HomogeneousTauLeapingImplicitFixedEuler.cc
new file mode 100644
index 0000000..591054f
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingImplicitFixedEuler.cc
@@ -0,0 +1,7 @@
+// -*- C++ -*-
+
+#define EULER
+
+#define __HomogeneousTauLeapingImplicit_ipp__
+#include "HomogeneousTauLeapingImplicit.ipp"
+#undef __HomogeneousTauLeapingImplicit_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingImplicitFixedEuler.d b/src/solvers/HomogeneousTauLeapingImplicitFixedEuler.d
new file mode 100644
index 0000000..92a4e9c
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingImplicitFixedEuler.d
@@ -0,0 +1,97 @@
+HomogeneousTauLeapingImplicitFixedEuler.o HomogeneousTauLeapingImplicitFixedEuler.d : \
+ HomogeneousTauLeapingImplicitFixedEuler.cc \
+ HomogeneousTauLeapingImplicit.ipp ../stochastic/TauLeapingImplicit.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../uniform/Default.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/poisson/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/../third-party/Eigen/LU \
+ ../stochastic/../third-party/Eigen/Core \
+ ../stochastic/../third-party/Eigen/src/Core/util/DisableMSVCWarnings.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/Macros.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/Constants.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/ForwardDeclarations.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/Meta.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/XprHelper.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/StaticAssert.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/Memory.h \
+ ../stochastic/../third-party/Eigen/src/Core/NumTraits.h \
+ ../stochastic/../third-party/Eigen/src/Core/MathFunctions.h \
+ ../stochastic/../third-party/Eigen/src/Core/GenericPacketMath.h \
+ ../stochastic/../third-party/Eigen/src/Core/arch/SSE/PacketMath.h \
+ ../stochastic/../third-party/Eigen/src/Core/Functors.h \
+ ../stochastic/../third-party/Eigen/src/Core/MatrixBase.h \
+ ../stochastic/../third-party/Eigen/src/Core/Coeffs.h \
+ ../stochastic/../third-party/Eigen/src/Core/Assign.h \
+ ../stochastic/../third-party/Eigen/src/Core/MatrixStorage.h \
+ ../stochastic/../third-party/Eigen/src/Core/NestByValue.h \
+ ../stochastic/../third-party/Eigen/src/Core/Flagged.h \
+ ../stochastic/../third-party/Eigen/src/Core/Matrix.h \
+ ../stochastic/../third-party/Eigen/src/Core/Cwise.h \
+ ../stochastic/../third-party/Eigen/src/Core/CwiseBinaryOp.h \
+ ../stochastic/../third-party/Eigen/src/Core/CwiseUnaryOp.h \
+ ../stochastic/../third-party/Eigen/src/Core/CwiseNullaryOp.h \
+ ../stochastic/../third-party/Eigen/src/Core/Dot.h \
+ ../stochastic/../third-party/Eigen/src/Core/Product.h \
+ ../stochastic/../third-party/Eigen/src/Core/DiagonalProduct.h \
+ ../stochastic/../third-party/Eigen/src/Core/SolveTriangular.h \
+ ../stochastic/../third-party/Eigen/src/Core/MapBase.h \
+ ../stochastic/../third-party/Eigen/src/Core/Map.h \
+ ../stochastic/../third-party/Eigen/src/Core/Block.h \
+ ../stochastic/../third-party/Eigen/src/Core/Minor.h \
+ ../stochastic/../third-party/Eigen/src/Core/Transpose.h \
+ ../stochastic/../third-party/Eigen/src/Core/DiagonalMatrix.h \
+ ../stochastic/../third-party/Eigen/src/Core/DiagonalCoeffs.h \
+ ../stochastic/../third-party/Eigen/src/Core/Sum.h \
+ ../stochastic/../third-party/Eigen/src/Core/Redux.h \
+ ../stochastic/../third-party/Eigen/src/Core/Visitor.h \
+ ../stochastic/../third-party/Eigen/src/Core/Fuzzy.h \
+ ../stochastic/../third-party/Eigen/src/Core/IO.h \
+ ../stochastic/../third-party/Eigen/src/Core/Swap.h \
+ ../stochastic/../third-party/Eigen/src/Core/CommaInitializer.h \
+ ../stochastic/../third-party/Eigen/src/Core/Part.h \
+ ../stochastic/../third-party/Eigen/src/Core/CacheFriendlyProduct.h \
+ ../stochastic/../third-party/Eigen/src/Core/util/EnableMSVCWarnings.h \
+ ../stochastic/../third-party/Eigen/src/LU/LU.h \
+ ../stochastic/../third-party/Eigen/src/LU/Determinant.h \
+ ../stochastic/../third-party/Eigen/src/LU/Inverse.h \
+ ../stochastic/../third-party/Eigen/Array \
+ ../stochastic/../third-party/Eigen/src/Array/CwiseOperators.h \
+ ../stochastic/../third-party/Eigen/src/Array/Functors.h \
+ ../stochastic/../third-party/Eigen/src/Array/BooleanRedux.h \
+ ../stochastic/../third-party/Eigen/src/Array/Select.h \
+ ../stochastic/../third-party/Eigen/src/Array/PartialRedux.h \
+ ../stochastic/../third-party/Eigen/src/Array/Random.h \
+ ../stochastic/../third-party/Eigen/src/Array/Norms.h \
+ ../stochastic/TauLeapingImplicit.ipp \
+ ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingMidpoint.cc b/src/solvers/HomogeneousTauLeapingMidpoint.cc
new file mode 100644
index 0000000..06bc95c
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingMidpoint.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#define MIDPOINT
+
+const bool CorrectNegativePopulations = true;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingMidpoint.d b/src/solvers/HomogeneousTauLeapingMidpoint.d
new file mode 100644
index 0000000..4fd7e92
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingMidpoint.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingMidpoint.o HomogeneousTauLeapingMidpoint.d : HomogeneousTauLeapingMidpoint.cc \
+ HomogeneousTauLeaping.ipp ../stochastic/TauLeaping.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingMidpointNoCorrection.cc b/src/solvers/HomogeneousTauLeapingMidpointNoCorrection.cc
new file mode 100644
index 0000000..f15942c
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingMidpointNoCorrection.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#define MIDPOINT
+
+const bool CorrectNegativePopulations = false;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingMidpointNoCorrection.d b/src/solvers/HomogeneousTauLeapingMidpointNoCorrection.d
new file mode 100644
index 0000000..7f75fa0
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingMidpointNoCorrection.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingMidpointNoCorrection.o HomogeneousTauLeapingMidpointNoCorrection.d : \
+ HomogeneousTauLeapingMidpointNoCorrection.cc HomogeneousTauLeaping.ipp \
+ ../stochastic/TauLeaping.h ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingRungeKutta4.cc b/src/solvers/HomogeneousTauLeapingRungeKutta4.cc
new file mode 100644
index 0000000..15e5c08
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingRungeKutta4.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#define RUNGE_KUTTA_4
+
+const bool CorrectNegativePopulations = true;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingRungeKutta4.d b/src/solvers/HomogeneousTauLeapingRungeKutta4.d
new file mode 100644
index 0000000..8ceb02a
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingRungeKutta4.d
@@ -0,0 +1,41 @@
+HomogeneousTauLeapingRungeKutta4.o HomogeneousTauLeapingRungeKutta4.d : HomogeneousTauLeapingRungeKutta4.cc \
+ HomogeneousTauLeaping.ipp ../stochastic/TauLeaping.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingRungeKutta4NoCorrection.cc b/src/solvers/HomogeneousTauLeapingRungeKutta4NoCorrection.cc
new file mode 100644
index 0000000..f7d2336
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingRungeKutta4NoCorrection.cc
@@ -0,0 +1,9 @@
+// -*- C++ -*-
+
+#define RUNGE_KUTTA_4
+
+const bool CorrectNegativePopulations = false;
+
+#define __HomogeneousTauLeaping_ipp__
+#include "HomogeneousTauLeaping.ipp"
+#undef __HomogeneousTauLeaping_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingRungeKutta4NoCorrection.d b/src/solvers/HomogeneousTauLeapingRungeKutta4NoCorrection.d
new file mode 100644
index 0000000..0af419c
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingRungeKutta4NoCorrection.d
@@ -0,0 +1,42 @@
+HomogeneousTauLeapingRungeKutta4NoCorrection.o HomogeneousTauLeapingRungeKutta4NoCorrection.d : \
+ HomogeneousTauLeapingRungeKutta4NoCorrection.cc \
+ HomogeneousTauLeaping.ipp ../stochastic/TauLeaping.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeaping.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingSal.ipp b/src/solvers/HomogeneousTauLeapingSal.ipp
new file mode 100644
index 0000000..27b0ed8
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingSal.ipp
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+
+#ifndef __HomogeneousTauLeapingSal_ipp__
+#error This file is an implementation detail.
+#endif
+
+// CONTINUE
+// 30% improvement.
+//#define NUMERICAL_POISSON_HERMITE_APPROXIMATION
+// 10% improvement.
+//#define NUMERICAL_POISSON_STORE_INVERSE
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#error Custom propensities are not supported.
+#endif
+
+#include "stochastic/TauLeapingSal.h"
+
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::State State;
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::TauLeapingSal TauLeaping;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE
+ assert(solverParameters.size() == 1);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ TauLeaping solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double>
+ reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ double totalSteps = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+#ifdef FIXED
+ solver.simulateFixedLinear(solverParameters[0], frameTimes[i]);
+#else
+ solver.simulateLinear(solverParameters[0], frameTimes[i]);
+#endif
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ totalReactionCount += solver.getState().getReactionCount();
+ totalSteps += solver.getStepCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Reaction count: " << totalReactionCount << '\n'
+ << "Step count: " << totalSteps << '\n';
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousTauLeapingSalFixedLinear.cc b/src/solvers/HomogeneousTauLeapingSalFixedLinear.cc
new file mode 100644
index 0000000..e8b392b
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingSalFixedLinear.cc
@@ -0,0 +1,7 @@
+// -*- C++ -*-
+
+#define FIXED
+
+#define __HomogeneousTauLeapingSal_ipp__
+#include "HomogeneousTauLeapingSal.ipp"
+#undef __HomogeneousTauLeapingSal_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingSalFixedLinear.d b/src/solvers/HomogeneousTauLeapingSalFixedLinear.d
new file mode 100644
index 0000000..62771d0
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingSalFixedLinear.d
@@ -0,0 +1,42 @@
+HomogeneousTauLeapingSalFixedLinear.o HomogeneousTauLeapingSalFixedLinear.d : \
+ HomogeneousTauLeapingSalFixedLinear.cc HomogeneousTauLeapingSal.ipp \
+ ../stochastic/TauLeapingSal.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/PropensityTimeDerivatives.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeapingSal.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTauLeapingSalLinear.cc b/src/solvers/HomogeneousTauLeapingSalLinear.cc
new file mode 100644
index 0000000..494fced
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingSalLinear.cc
@@ -0,0 +1,5 @@
+// -*- C++ -*-
+
+#define __HomogeneousTauLeapingSal_ipp__
+#include "HomogeneousTauLeapingSal.ipp"
+#undef __HomogeneousTauLeapingSal_ipp__
diff --git a/src/solvers/HomogeneousTauLeapingSalLinear.d b/src/solvers/HomogeneousTauLeapingSalLinear.d
new file mode 100644
index 0000000..4fc2abd
--- /dev/null
+++ b/src/solvers/HomogeneousTauLeapingSalLinear.d
@@ -0,0 +1,42 @@
+HomogeneousTauLeapingSalLinear.o HomogeneousTauLeapingSalLinear.d : HomogeneousTauLeapingSalLinear.cc \
+ HomogeneousTauLeapingSal.ipp ../stochastic/TauLeapingSal.h \
+ ../stochastic/Solver.h ../stochastic/State.h \
+ ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/PropensityTimeDerivatives.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBinaryHeap.h \
+ ../stochastic/../ads/indexedPriorityQueue/IndexedPriorityQueueBase.h \
+ ../stochastic/../ads/indexedPriorityQueue/../../ext/vector.h \
+ ../stochastic/../numerical/random/uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/uniform/Default.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionMaximumMean.h \
+ ../stochastic/../numerical/random/poisson/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInversionChopDown.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.h \
+ ../stochastic/../numerical/random/poisson/../normal/Default.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.h \
+ ../stochastic/../numerical/random/poisson/../normal/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/poisson/../normal/NormalGeneratorZigguratVoss.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorAcceptanceComplementWinrand.ipp \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorNormal.h \
+ ../stochastic/../numerical/random/poisson/../../round/round.h \
+ ../stochastic/../numerical/random/poisson/PoissonGeneratorInvAcNormSure.ipp \
+ ../stochastic/TauLeapingSal.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp input.ipp
diff --git a/src/solvers/HomogeneousTrajectoryTreeFull.cc b/src/solvers/HomogeneousTrajectoryTreeFull.cc
new file mode 100644
index 0000000..dfb8049
--- /dev/null
+++ b/src/solvers/HomogeneousTrajectoryTreeFull.cc
@@ -0,0 +1,190 @@
+// -*- C++ -*-
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+#include "Propensities.h"
+#endif
+
+#include "stochastic/TrajectoryTreeFull.h"
+#include "stochastic/ReactionSet.h"
+#include "stochastic/reactionPropensityInfluence.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include "numerical/random/exponential/ExponentialGeneratorZiggurat.h"
+//#include "numerical/random/discrete/DiscreteGenerator2DSearch.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the histograms to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ // The exponential generator.
+ typedef numerical::ExponentialGeneratorZiggurat<> ExponentialGenerator;
+ typedef ExponentialGenerator::DiscreteUniformGenerator
+ DiscreteUniformGenerator;
+ typedef stochastic::State State;
+
+#ifdef STOCHASTIC_CUSTOM_PROPENSITIES
+ typedef Propensities<true> PropensitiesFunctor;
+#else
+ // If we use the reaction influence array, we will compute the propensities
+ // one at a time.
+ typedef stochastic::PropensitiesSingle<true> PropensitiesFunctor;
+#endif
+
+ typedef PropensitiesFunctor::ReactionSetType ReactionSet;
+ typedef stochastic::TrajectoryTreeFull<ExponentialGenerator,
+ PropensitiesFunctor> Solver;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+ // Only one frame is allowed.
+ assert(frameTimes.size() == 1);
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Build the array of reaction influences.
+ //
+ array::StaticArrayOfArrays<std::size_t> reactionInfluence;
+ stochastic::computeReactionPropensityInfluence
+ (initialPopulations.size(), reactions.getBeginning(), reactions.getEnd(),
+ &reactionInfluence, true);
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), reactionInfluence,
+ frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/HomogeneousTrajectoryTreeFull.d b/src/solvers/HomogeneousTrajectoryTreeFull.d
new file mode 100644
index 0000000..2bc5424
--- /dev/null
+++ b/src/solvers/HomogeneousTrajectoryTreeFull.d
@@ -0,0 +1,31 @@
+HomogeneousTrajectoryTreeFull.o HomogeneousTrajectoryTreeFull.d : HomogeneousTrajectoryTreeFull.cc \
+ ../stochastic/TrajectoryTreeFull.h ../stochastic/Solver.h \
+ ../stochastic/State.h ../stochastic/../array/SparseVector.h \
+ ../stochastic/../array/../ads/algorithm/is_sorted.h \
+ ../stochastic/../array/../ads/functor/select.h \
+ ../stochastic/../array/../ads/iterator/TransformIterator.h \
+ ../stochastic/../array/../ads/iterator/AdaptedIterator.h \
+ ../stochastic/../array/../ads/iterator/../functor/index.h \
+ ../stochastic/../array/../ext/pair.h \
+ ../stochastic/../array/SparseVector.ipp \
+ ../stochastic/../array/StaticArrayOfArrays.h \
+ ../stochastic/../array/../ext/vector.h \
+ ../stochastic/../array/StaticArrayOfArrays.ipp \
+ ../stochastic/../ext/vector.h ../stochastic/State.ipp \
+ ../stochastic/Propensities.h ../stochastic/ReactionSet.h \
+ ../stochastic/Reaction.h ../stochastic/../loki/TypeManip.h \
+ ../stochastic/Reaction.ipp ../stochastic/ReactionSet.ipp \
+ ../stochastic/HistogramsPackedArray.h ../stochastic/HistogramsPacked.h \
+ ../stochastic/HistogramReference.h \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ ../stochastic/../numerical/random/exponential/../uniform/ContinuousUniformGenerator.h \
+ ../stochastic/../numerical/random/exponential/../uniform/Default.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.h \
+ ../stochastic/../numerical/random/exponential/../uniform/DiscreteUniformGeneratorMt19937.ipp \
+ ../stochastic/../numerical/random/exponential/ExponentialGeneratorZiggurat.ipp \
+ ../stochastic/ReactionSet.h ../stochastic/reactionPropensityInfluence.h \
+ ../stochastic/reactionPropensityInfluence.ipp ../ads/timer/Timer.h \
+ ../ads/timer/Timer.ipp ../ads/utility/ParseOptionsArguments.h \
+ ../ads/utility/ParseOptionsArguments.ipp \
+ ../numerical/random/exponential/ExponentialGeneratorZiggurat.h \
+ input.ipp
diff --git a/src/solvers/InhomogeneousHistogramsSteadyStateDirectTimeSteps.cc b/src/solvers/InhomogeneousHistogramsSteadyStateDirectTimeSteps.cc
new file mode 100644
index 0000000..a94f5b4
--- /dev/null
+++ b/src/solvers/InhomogeneousHistogramsSteadyStateDirectTimeSteps.cc
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+
+#include "stochastic/InhomogeneousHistogramsSteadyStateDirect.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+// Problem-specific propensities.
+#include "computePropensities.h"
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the histograms to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::InhomogeneousHistogramsSteadyStateDirect Solver;
+ typedef Solver::ReactionSet ReactionSet;
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // Equilibration time
+ double equilibrationTime;
+ std::cin >> equilibrationTime;
+
+ // Recording time
+ double recordingTime;
+ std::cin >> recordingTime;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ reactions, recordedSpecies, numberOfBins, histogramMultiplicity,
+ maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ if (! solver.getError().empty()) {
+ break;
+ }
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate(equilibrationTime, recordingTime);
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/InhomogeneousHistogramsTransientDirect.cc b/src/solvers/InhomogeneousHistogramsTransientDirect.cc
new file mode 100644
index 0000000..f416ea9
--- /dev/null
+++ b/src/solvers/InhomogeneousHistogramsTransientDirect.cc
@@ -0,0 +1,159 @@
+// -*- C++ -*-
+
+#include "stochastic/InhomogeneousHistogramsTransientDirect.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+// Problem-specific propensities.
+#include "computePropensities.h"
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::InhomogeneousHistogramsTransientDirect Solver;
+ typedef Solver::ReactionSet ReactionSet;
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // The list of solver parameters is empty.
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ // Number of bins in the histograms.
+ std::size_t numberOfBins;
+ std::cin >> numberOfBins;
+
+ // Histogram multiplicity.
+ std::size_t histogramMultiplicity;
+ std::cin >> histogramMultiplicity;
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ reactions, frameTimes, recordedSpecies, numberOfBins,
+ histogramMultiplicity, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ double totalReactionCount = 0;
+ std::size_t numberOfTrajectories = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t trajectoriesInTask = 0;
+ std::cin >> trajectoriesInTask;
+ numberOfTrajectories += trajectoriesInTask;
+ if (trajectoriesInTask == 0) {
+ break;
+ }
+
+ for (std::size_t n = 0; n != trajectoriesInTask; ++n) {
+ timer.tic();
+ // Run the simulation.
+ solver.initialize(initialPopulations, startTime);
+ solver.simulate();
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ }
+ // Write the number of trajectories in this task to indicate that the
+ // simulations have completed.
+ std::cout << trajectoriesInTask << '\n';
+ std::cout.flush();
+ }
+ // Synchronize the histograms.
+ solver.synchronize();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // The number of trajectories generated.
+ std::cout << numberOfTrajectories << '\n';
+ // Write the histograms.
+ std::cout << solver.getHistograms();
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n"
+ << elapsedTime << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/InhomogeneousOdeReactionRungeKuttaCashKarp.cc b/src/solvers/InhomogeneousOdeReactionRungeKuttaCashKarp.cc
new file mode 100644
index 0000000..030a6a0
--- /dev/null
+++ b/src/solvers/InhomogeneousOdeReactionRungeKuttaCashKarp.cc
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+
+#include "stochastic/OdeReaction.h"
+#include "stochastic/PropensitiesInhomogeneous.h"
+
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+#include <limits>
+
+#include <cassert>
+
+// Problem-specific propensities.
+#include "computePropensities.h"
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::OdeReaction<true/*IsInhomogeneous*/,
+ stochastic::PropensitiesInhomogeneous<false/*IsDiscrete*/> > Solver;
+ typedef Solver::PropensitiesFunctor PropensitiesFunctor;
+ typedef PropensitiesFunctor::ReactionSet ReactionSet;
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 1);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()),
+ PropensitiesFunctor(reactions), maximumAllowedSteps);
+
+ //
+ // Run the simulation.
+ //
+
+ solver.setupRungeKuttaCashKarp();
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ double totalSteps = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ populations.clear();
+ reactionCounts.clear();
+ // Blank line for the MT 19937 state.
+ std::cout << '\n';
+
+ bool success = true;
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+ success = solver.simulateRungeKuttaCashKarp(solverParameters[0],
+ frameTimes[i]);
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ if (! success) {
+ break;
+ }
+ }
+ totalReactionCount += solver.getState().getReactionCount();
+ totalSteps += solver.getStepCount();
+ if (success) {
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ else {
+ // Error message.
+ std::cout << solver.getError();
+ const std::vector<double>& populations =
+ solver.getState().getPopulations();
+ for (std::size_t n = 0; n != populations.size(); ++n) {
+ if (populations[n] < 0) {
+ std::cout << " Species " << n + 1
+ << " has the negative population " << populations[n]
+ << ".";
+ }
+ }
+ std::cout << '\n';
+ }
+ }
+ // Blank line for the final MT 19937 state.
+ std::cout << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Reaction count: " << totalReactionCount << '\n'
+ << "Step count: " << totalSteps << '\n';
+ }
+
+ return 0;
+}
diff --git a/src/solvers/InhomogeneousTimeSeriesAllReactionsDirect.cc b/src/solvers/InhomogeneousTimeSeriesAllReactionsDirect.cc
new file mode 100644
index 0000000..383f3a0
--- /dev/null
+++ b/src/solvers/InhomogeneousTimeSeriesAllReactionsDirect.cc
@@ -0,0 +1,179 @@
+// -*- C++ -*-
+
+#include "stochastic/InhomogeneousTimeSeriesAllReactionsDirect.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+// Problem-specific propensities.
+#include "computePropensities.h"
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::InhomogeneousTimeSeriesAllReactionsDirect Solver;
+ typedef Solver::ReactionSet ReactionSet;
+
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // Equilibration time.
+ double equilibrationTime;
+ std::cin >> equilibrationTime;
+
+ // Recording time.
+ double recordingTime;
+ std::cin >> recordingTime;
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()), reactions, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the reaction indices and times.
+ std::vector<double> equilibratedPopulations(numberOfSpecies);
+ std::vector<std::size_t> reactionIndices;
+ std::back_insert_iterator<std::vector<std::size_t> >
+ indicesIterator(reactionIndices);
+ std::vector<double> reactionTimes;
+ std::back_insert_iterator<std::vector<double> > timesIterator(reactionTimes);
+ double totalReactionCount = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the reaction indices and times.
+ reactionIndices.clear();
+ reactionTimes.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ timer.tic();
+ solver.initialize(initialPopulations, startTime);
+ // Equilibrate
+ if (equilibrationTime != 0) {
+ solver.simulate(startTime + equilibrationTime);
+ }
+ std::copy(solver.getState().getPopulations().begin(),
+ solver.getState().getPopulations().end(),
+ equilibratedPopulations.begin());
+ // Simulate and record.
+ solver.simulate(startTime + equilibrationTime + recordingTime,
+ indicesIterator, timesIterator);
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // Write the initial (possibly equilibrated) populations.
+ std::copy(equilibratedPopulations.begin(),
+ equilibratedPopulations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction indices.
+ std::copy(reactionIndices.begin(), reactionIndices.end(),
+ std::ostream_iterator<std::size_t>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction times.
+ std::cout.precision(16);
+ std::copy(reactionTimes.begin(), reactionTimes.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout.precision(3);
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/InhomogeneousTimeSeriesUniformDirect.cc b/src/solvers/InhomogeneousTimeSeriesUniformDirect.cc
new file mode 100644
index 0000000..0bfa131
--- /dev/null
+++ b/src/solvers/InhomogeneousTimeSeriesUniformDirect.cc
@@ -0,0 +1,171 @@
+// -*- C++ -*-
+
+#include "stochastic/InhomogeneousTimeSeriesUniformDirect.h"
+
+#include "ads/timer/Timer.h"
+#include "ads/utility/ParseOptionsArguments.h"
+
+#include <iostream>
+#include <iterator>
+
+#include <cassert>
+
+// Problem-specific propensities.
+#include "computePropensities.h"
+
+namespace {
+
+ //
+ // Global variables.
+ //
+
+ //! The program name.
+ static std::string programName;
+
+ //
+ // Local functions.
+ //
+
+ //! Exit with an error message.
+ void
+ exitOnError() {
+ std::cerr
+ << "Bad arguments. Usage:\n"
+ << programName << "\n\n"
+ << "This program reads the model and simulations parameters from\n"
+ << "stdin and writes the trajectories to stdout.\n";
+ // CONTINUE
+ exit(1);
+ }
+
+}
+
+
+//! The main loop.
+int
+main(int argc, char* argv[]) {
+ typedef stochastic::InhomogeneousTimeSeriesUniformDirect Solver;
+ typedef Solver::ReactionSet ReactionSet;
+ typedef stochastic::State State;
+
+#define __input_ipp__
+#include "input.ipp"
+#undef __input_ipp__
+
+ // Check the number of solver parameters.
+ // CONTINUE: Error message.
+ assert(solverParameters.size() == 0);
+
+ // Number of frames and frame times.
+ std::vector<double> frameTimes;
+ std::cin >> frameTimes;
+
+ //
+ // Construct the simulation class.
+ //
+ Solver solver(State(initialPopulations, reactions.getBeginning(),
+ reactions.getEnd()), reactions, maximumAllowedSteps);
+
+ //
+ // Read the Mersenne twister state.
+ //
+ std::cin >> solver.getDiscreteUniformGenerator();
+
+ // There should be no more options.
+ if (! parser.areOptionsEmpty()) {
+ std::cerr << "Error. Unmatched options:\n";
+ parser.printOptions(std::cerr);
+ exitOnError();
+ }
+
+ //
+ // Run the simulation.
+ //
+
+ // Empty line for the dictionary of information.
+ std::cout << '\n';
+
+ // The containers for the populations and the reaction counts.
+ std::vector<double> populations(frameTimes.size() * numberOfSpecies);
+ std::vector<double> reactionCounts(frameTimes.size() * numberOfReactions);
+
+ double totalReactionCount = 0;
+ ads::Timer timer;
+ double elapsedTime = 0;
+ // Loop until there are no more tasks.
+ while (true) {
+ // The number of trajectories to generate in this task.
+ std::size_t numberOfTrajectories = 0;
+ std::cin >> numberOfTrajectories;
+ if (numberOfTrajectories == 0) {
+ break;
+ }
+ std::cout << numberOfTrajectories << '\n';
+
+ for (std::size_t n = 0; n != numberOfTrajectories; ++n) {
+ // Clear the containers for holding the populations and reaction counts.
+ populations.clear();
+ reactionCounts.clear();
+ // Write the initial Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+
+ timer.tic();
+ solver.initialize(initialPopulations, startTime);
+ for (std::size_t i = 0; i != frameTimes.size(); ++i) {
+ // Advance to the next frame.
+ solver.simulate(frameTimes[i]);
+ if (! solver.getError().empty()) {
+ break;
+ }
+ // Record the populations.
+ for (std::size_t i = 0; i != recordedSpecies.size(); ++i) {
+ populations.push_back(solver.getState().getPopulations()
+ [recordedSpecies[i]]);
+ }
+ // Record the reaction counts.
+ for (std::size_t i = 0; i != recordedReactions.size(); ++i) {
+ reactionCounts.push_back(solver.getState().getReactionCounts()
+ [recordedReactions[i]]);
+ }
+ }
+ elapsedTime += timer.toc();
+ totalReactionCount += solver.getState().getReactionCount();
+ if (! solver.getError().empty()) {
+ std::cout << solver.getError() << '\n';
+ }
+ else {
+ // No errors.
+ std::cout << '\n';
+ // Write the populations.
+ std::copy(populations.begin(), populations.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ // Write the reaction counts.
+ std::copy(reactionCounts.begin(), reactionCounts.end(),
+ std::ostream_iterator<double>(std::cout, " "));
+ std::cout << '\n';
+ }
+ }
+ // Write the final Mersenne twister state.
+ std::cout << solver.getDiscreteUniformGenerator() << '\n';
+ std::cout.flush();
+ }
+
+ if (arePrintingPerformance) {
+ // Restore the default precision.
+ std::cout.precision(defaultPrecision);
+ // Performance message.
+ std::cout << "Done. Simulation time = " << elapsedTime << "\n"
+ << "The ensemble of simulations took "
+ << totalReactionCount << " steps.\n"
+ << "Reactions per second = "
+ << totalReactionCount / elapsedTime << ".\n"
+ << "Time per reaction = "
+ << elapsedTime / totalReactionCount * 1e9 << " nanoseconds\n";
+ std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
+ std::cout.precision(0);
+ std::cout << elapsedTime / totalReactionCount * 1e9 << "\n";
+ }
+
+ return 0;
+}
diff --git a/src/solvers/Makefile b/src/solvers/Makefile
new file mode 100644
index 0000000..f4ef259
--- /dev/null
+++ b/src/solvers/Makefile
@@ -0,0 +1,66 @@
+# -*- Makefile -*-
+
+# Add the location of the source code.
+CXXINCLUDE += -I..
+
+#include Makefile.compilers
+CXX = g++
+CXXFLAGS += $(CXXINCLUDE)
+ifdef DEBUG
+CXXFLAGS += -g -DDEBUG_stlib
+else
+# Optimization
+# Improves performance by 3 or 4%. Should I use it?
+#CXXFLAGS += -ffast-math
+# Increase the inline limit from 600 to 6000.
+CXXFLAGS += -finline-limit=6000
+CXXFLAGS += -O3 -funroll-loops -Wstrict-aliasing
+endif
+# Language.
+CXXFLAGS += -ansi -Wall
+# Commented out for Eigen.
+#CXXFLAGS += -pedantic
+
+ifeq ($(shell uname),Linux)
+ LOADLIBES += -lrt
+endif
+
+ifndef SOURCES
+# The homogeneous sources have mass action solvers that can be pre-compiled.
+SOURCES = $(wildcard Homogeneous*.cc)
+endif
+DEPENDENCIES = $(SOURCES:.cc=.d)
+TARGETS = $(SOURCES:.cc=)
+
+.SUFFIXES:
+.SUFFIXES: .cc .d
+
+# The default target.
+install: all
+ mv $(TARGETS) ../../solvers
+
+all: $(TARGETS)
+
+clean:
+ $(RM) *.o *.d *~ core* *.stackdump .DS_Store .Thumbs.db
+
+distclean:
+ $(MAKE) clean
+ $(RM) $(TARGETS) $(DEPENDENCIES)
+
+again:
+ $(MAKE) distclean
+ $(MAKE)
+
+# Implicit rules.
+
+.cc.d:
+ $(CXX) -MM $(CXXINCLUDE) $< > $@.$$$$; \
+ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
+ $(RM) $@.$$$$
+
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(MAKECMDGOALS),distclean)
+-include $(DEPENDENCIES)
+endif
+endif
diff --git a/src/solvers/Makefile.compilers b/src/solvers/Makefile.compilers
new file mode 100644
index 0000000..9b2732c
--- /dev/null
+++ b/src/solvers/Makefile.compilers
@@ -0,0 +1,150 @@
+# -*- Makefile -*-
+
+# This makefile contains compiler-specific definitions.
+
+#CXXFLAGS += -pg
+#LINKERFLAGS += -pg
+
+CXX = g++
+CXXFLAGS += $(CXXINCLUDE)
+
+# Architecture.
+ifdef UNIVERSAL
+CXXFLAGS += -arch i386 -arch x86_64
+endif
+
+ifeq ($(CXX),g++)
+# 32 or 64-bit.
+ifeq ($(BITS),32)
+CXXFLAGS += -m32
+LINKERFLAGS += -m32
+endif
+ifeq ($(BITS),64)
+CXXFLAGS += -m64
+LINKERFLAGS += -m64
+endif
+ifdef DEBUG
+CXXFLAGS += -g -DDEBUG_stlib
+else
+# Optimization
+# No difference
+#CXXFLAGS += -fno-rtti
+# Not as fast as the full list.
+#CXXFLAGS += -fast
+# Little difference.
+#CXXFLAGS += -freorder-blocks -fsched-interblock
+# Improves performance by 3 or 4%. Should I use it?
+#CXXFLAGS += -ffast-math
+# Increase the inline limit from 600 to 6000.
+CXXFLAGS += -finline-limit=6000
+#CXXFLAGS += -finline-limit=100
+CXXFLAGS += -O3 -funroll-loops -fstrict-aliasing -Wstrict-aliasing
+#CXXFLAGS += -O1 -fno-inline -funroll-loops -fstrict-aliasing -Wstrict-aliasing
+#CXXFLAGS += -O3 -fno-inline -funroll-loops -fstrict-aliasing
+#CXXFLAGS += -O3 -march=prescott -mtune=prescott -mfpmath=sse -msse3
+#CXXFLAGS += -fast
+endif
+# Language.
+CXXFLAGS += -ansi -Wall
+# Commented out for Eigen.
+#CXXFLAGS += -pedantic
+endif
+
+ifeq ($(CXX),g++-4.2)
+# 32 or 64-bit.
+ifeq ($(BITS),32)
+CXXFLAGS += -m32
+LINKERFLAGS += -m32
+endif
+ifeq ($(BITS),64)
+CXXFLAGS += -m64
+LINKERFLAGS += -m64
+endif
+# Optimization
+CXXFLAGS += -finline-limit=6000
+CXXFLAGS += -O3 -funroll-loops -fstrict-aliasing -Wstrict-aliasing
+# Language.
+CXXFLAGS += -ansi -pedantic -Wall
+ifdef OPENMP
+CXXFLAGS += -fopenmp
+endif
+endif
+
+ifeq ($(CXX),g++-dp-4.2)
+# 32 or 64-bit.
+ifeq ($(BITS),32)
+CXXFLAGS += -m32
+LINKERFLAGS += -m32
+endif
+ifeq ($(BITS),64)
+CXXFLAGS += -m64
+LINKERFLAGS += -m64
+endif
+# Optimization
+CXXFLAGS += -O3 -funroll-loops -fstrict-aliasing
+#CXXFLAGS += -O3 -march=prescott -mtune=prescott -mfpmath=sse -msse3
+# Language.
+CXXFLAGS += -ansi -pedantic -Wall
+ifdef OPENMP
+CXXFLAGS += -fopenmp
+LINKERFLAGS += -lgomp
+CXXINCLUDE += -I/opt/local/include/gcc42
+endif
+endif
+
+ifeq ($(CXX),g++-mp-4.3)
+# 32 or 64-bit.
+ifeq ($(BITS),32)
+CXXFLAGS += -m32
+LINKERFLAGS += -m32
+endif
+ifeq ($(BITS),64)
+CXXFLAGS += -m64
+LINKERFLAGS += -m64
+endif
+# Optimization
+CXXFLAGS += -O3 -funroll-loops -fstrict-aliasing
+# Language.
+CXXFLAGS += -ansi -pedantic -Wall
+ifdef OPENMP
+CXXFLAGS += -fopenmp
+endif
+endif
+
+# IBM XL compiler.
+ifeq ($(CXX),xlC)
+# CONTINUE: Switch to 64-bit.
+# Optimization flags.
+CXXFLAGS += -qcache=auto -O3 -qstrict -qstrict_induction -qinline -qmaxmem=8192 -qansialias -qhot -qunroll=yes
+# I don't use RTTI in the code.
+#CXXFLAGS += -qrtti
+# CONTINUE: Can I detect the architecture?
+# Flags for Datastar.
+#CXXFLAGS += -qarch=pwr4 -qtune=pwr4
+# Flags for uP.
+#CXXFLAGS += -qarch=pwr5 -qtune=pwr5
+endif
+
+# Intel compiler.
+ifeq ($(CXX),icc)
+# CONTINUE: Switch to 64-bit.
+CXXFLAGS += -O3 -Zp16 -ip -ansi_alias
+CXXFLAGS += -strict_ansi
+endif
+
+# PathScale compiler.
+ifeq ($(CXX),pathCC)
+# CONTINUE: Switch to 64-bit.
+CXXFLAGS += -O3 -INLINE:aggressive=ON -OPT:alias=typed
+CXXFLAGS += -ansi
+endif
+
+# PGI compiler.
+ifeq ($(CXX),pgCC)
+# CONTINUE: Switch to 64-bit.
+CXXFLAGS += -O3 -fastsse -Minline
+ifdef OPENMP
+CXXFLAGS += -mp
+LINKERFLAGS += -lpgmp -lpgthread
+endif
+endif
diff --git a/src/solvers/Propensities.h b/src/solvers/Propensities.h
new file mode 100644
index 0000000..c14bed8
--- /dev/null
+++ b/src/solvers/Propensities.h
@@ -0,0 +1,112 @@
+// -*- C++ -*-
+// Propensities.h
+
+#if !defined(__Propensities_h__)
+#define __Propensities_h__
+
+#include <cstddef>
+#include <cmath>
+
+#include "stochastic/ReactionSet.h"
+
+// Compute custom propensities.
+template<bool _IsDiscrete>
+class Propensities :
+ public stochastic::ReactionSet<_IsDiscrete> {
+private:
+
+ // The number of reactions.
+#include "PropensitiesNumberOfReactions.ipp"
+
+ //
+ // Public types.
+ //
+public:
+
+ // The population number type.
+ typedef double PopulationType;
+ // The number type.
+ typedef double Number;
+ //! A set of reactions.
+ typedef stochastic::ReactionSet<_IsDiscrete> ReactionSetType;
+ //! The reaction type.
+ typedef typename ReactionSetType::ReactionType ReactionType;
+ // The result type.
+ typedef Number result_type;
+
+ //
+ // Private types.
+ //
+private:
+
+ //
+ // Private types.
+ //
+private:
+
+ // The base class.
+ typedef ReactionSetType Base;
+ // A pointer to a member function that computes a single propensity.
+ typedef Number (Propensities::* PropensityMember)
+ (const PopulationType*) const;
+
+ //
+ // Member data.
+ //
+private:
+
+ PropensityMember _propensityFunctions[NumberOfReactions];
+
+ //
+ // Not implemented.
+ //
+private:
+
+ // Default constructor not implemented.
+ Propensities();
+ // Assignment operator not implemented.
+ Propensities&
+ operator=(const Propensities&);
+
+ //--------------------------------------------------------------------------
+ // Constructors etc.
+public:
+
+ // Constructor.
+#include "PropensitiesConstructor.ipp"
+
+ // Copy constructor.
+ Propensities(const Propensities& other) :
+ Base(other) {
+ for (std::size_t i = 0; i != NumberOfReactions; ++i) {
+ _propensityFunctions[i] = other._propensityFunctions[i];
+ }
+ }
+
+ // Destructor.
+ ~Propensities()
+ {}
+
+ //--------------------------------------------------------------------------
+ // Functor.
+public:
+
+ using Base::getSize;
+ using Base::getReaction;
+
+ // Return the specified propensity function.
+ template<typename _Container>
+ result_type
+ operator()(const std::size_t n, const _Container& populations) const {
+ return (this->*_propensityFunctions[n])(&populations[0]);
+ }
+
+ //--------------------------------------------------------------------------
+ // Compute propensities.
+private:
+
+#include "PropensitiesMemberFunctions.ipp"
+
+};
+
+#endif
diff --git a/src/solvers/SConstruct b/src/solvers/SConstruct
new file mode 100644
index 0000000..37c9c5c
--- /dev/null
+++ b/src/solvers/SConstruct
@@ -0,0 +1,15 @@
+# -*- python -*-
+
+import os.path
+from env import serial
+
+build = '../../solvers'
+VariantDir(build, '.', duplicate=0)
+
+if COMMAND_LINE_TARGETS:
+ sources = [x + '.cc' for x in COMMAND_LINE_TARGETS]
+else:
+ sources = Glob('Homogeneous*.cc')
+
+for source in sources:
+ serial.Program(os.path.join(build, str(source)))
diff --git a/src/solvers/env.py b/src/solvers/env.py
new file mode 100644
index 0000000..c20c628
--- /dev/null
+++ b/src/solvers/env.py
@@ -0,0 +1,54 @@
+# -*- python -*-
+
+import subprocess
+from SCons.Script import *
+
+def cpuCount():
+ """Return the number of available cores."""
+ try:
+ # The multiprocessing module was introduced in Python 2.6. It has been
+ # backported 2.5 and 2.4 and is included in some distributions of these.
+ import multiprocessing
+ return multiprocessing.cpu_count()
+ except:
+ return 1
+
+# Set the number of concurrent jobs to the number of available cores.
+SetOption('num_jobs', cpuCount())
+
+mode = ARGUMENTS.get('mode', 'release')
+
+serial = Environment(CPPPATH='..')
+if serial['CXX'] == 'g++':
+ if mode == 'release':
+ # Increase the inline limit from 600 to 6000.
+ serial.AppendUnique(CCFLAGS=['-O3', '-funroll-loops',
+ '-fstrict-aliasing',
+ '-finline-limit=6000'])
+ elif mode == 'debug':
+ serial.AppendUnique(CCFLAGS=['-g', '-DDEBUG_stlib'])
+ else:
+ print('Error: Expected "debug" or "release" for the mode argument, '\
+ 'found: "' + mode + '".')
+ Exit(1)
+ # Warnings. I don't use the pedantic flag because it will break code that
+ # uses long long.
+ serial.AppendUnique(CCFLAGS=['-ansi', '-Wall', '-Wextra',
+ '-Wstrict-aliasing=2', '-Wno-unknown-pragmas'])
+ # Use the rt library on linux, but not on darwin or windows.
+ if serial['PLATFORM'] == 'posix':
+ serial.AppendUnique(LIBS=['rt'])
+ # We need this to compile the implicit tau-leaping solvers for PPC
+ # architectures.
+ serial.AppendUnique(CCFLAGS=['-DEIGEN_DONT_VECTORIZE'])
+ # Architectures.
+ uname = os.uname()
+ if uname[0] == 'Darwin':
+ # Snow Leopard is 10.x.x. It only supports Intel architectures.
+ if int(uname[2].split('.')[0]) >= 10:
+ arch = ['-arch', 'i386', '-arch', 'x86_64']
+ else:
+ # Leopard may run on either Power PC or Intel architectures.
+ arch = ['-arch', 'i386', '-arch', 'x86_64', '-arch', 'ppc',
+ '-arch', 'ppc64']
+ serial.Append(CCFLAGS=arch, LINKFLAGS=arch)
diff --git a/src/solvers/input.ipp b/src/solvers/input.ipp
new file mode 100644
index 0000000..ca8ec17
--- /dev/null
+++ b/src/solvers/input.ipp
@@ -0,0 +1,108 @@
+// -*- C++ -*-
+
+#ifndef __input_ipp__
+#error This file is an implementation detail.
+#endif
+
+/*
+ Common input for all solvers:
+
+ <are printing information>
+ <number of species>
+ <number of reactions>
+ <list of initial amounts>
+ <packed reactions>
+ <list of propensity factors>
+ <number of species to record>
+ <list of species to record>
+ <number of reactions to record>
+ <list of reactions to record>
+ <maximum allowed steps>
+ <number of solver parameters>
+ <list of solver parameters>
+ <starting time>
+
+ Each term in brackets occupies a single line.
+
+ A value of zero indicates there is no limit on the maximum allowed steps.
+ (More precisely, the limit is std::numeric_limits<std::size_t>::max().)
+*/
+
+// Use 16 bits of precision for floating point types.
+std::size_t defaultPrecision = std::cout.precision();
+std::cout.precision(16);
+
+ads::ParseOptionsArguments parser(argc, argv);
+
+// Program name.
+programName = parser.getProgramName();
+
+// There should be no arguments.
+if (parser.getNumberOfArguments() != 0) {
+ std::cerr << "Bad arguments.\n"
+ << "You gave the arguments:\n";
+ parser.printArguments(std::cerr);
+ exitOnError();
+}
+
+// Performance information.
+const bool arePrintingPerformance = parser.getOption("p") ||
+ parser.getOption("performance");
+
+// If we are printing a Python dictionary of information.
+bool arePrintingInformation;
+std::cin >> arePrintingInformation;
+
+//
+// Read the model.
+//
+
+// The number of species and reactions.
+std::size_t numberOfSpecies = 0, numberOfReactions = 0;
+std::cin >> numberOfSpecies >> numberOfReactions;
+
+// The initial populations.
+std::vector<double> initialPopulations(numberOfSpecies);
+for (std::size_t i = 0; i != numberOfSpecies; ++i) {
+ std::cin >> initialPopulations[i];
+}
+
+// The reactions.
+ReactionSet reactions;
+stochastic::readReactantsAndProductsAscii(std::cin, numberOfReactions,
+ &reactions);
+
+// The propensity factors for the reactions.
+{
+ double rateConstant;
+ for (std::size_t i = 0; i != numberOfReactions; ++i) {
+ std::cin >> rateConstant;
+ reactions.setRateConstant(i, rateConstant);
+ }
+}
+
+// The recorded species.
+std::vector<std::size_t> recordedSpecies;
+std::cin >> recordedSpecies;
+
+// The recorded reactions.
+std::vector<std::size_t> recordedReactions;
+std::cin >> recordedReactions;
+
+//
+// Read the simulation parameters.
+//
+
+// Maximum allowed steps.
+double maximumAllowedSteps;
+std::cin >> maximumAllowedSteps;
+if (maximumAllowedSteps == 0) {
+ maximumAllowedSteps = std::numeric_limits<double>::max();
+}
+
+// The solver parameters.
+std::vector<double> solverParameters;
+std::cin >> solverParameters;
+
+double startTime;
+std::cin >> startTime;
diff --git a/src/solvers/msvs.py b/src/solvers/msvs.py
new file mode 100644
index 0000000..77dad36
--- /dev/null
+++ b/src/solvers/msvs.py
@@ -0,0 +1,37 @@
+# Run this script from an MSYS shell.
+import os, subprocess, sys, re
+from optparse import OptionParser
+
+parser = OptionParser()
+(options, args) = parser.parse_args()
+assert len(args) <= 1
+# The targets may be:
+# x86 for 32-bit native
+# x86_amd64 for 64-bit cross
+# amd64 for 64-bit native
+if args:
+ target = args[0]
+else:
+ target = ''
+
+# Get the solver source files.
+listing = os.listdir('.')
+fileNames = []
+for name in listing:
+ base, ext = os.path.splitext(name)
+ if ext == '.cc' and re.match('Homogeneous', name) and\
+ not base + '.exe' in listing:
+ fileNames.append(name)
+
+# Compile the solvers.
+for name in fileNames:
+ if not os.access(name[:-2] + 'exe', os.F_OK):
+ command = r'"vc10vars32.bat ' + target \
+ + r'"&&cl /I.. /I..\third-party /Ox /EHsc ' + name
+ subprocess.check_call(command)
+
+# Install.
+#subprocess.check_call(r'del *.obj')
+#subprocess.check_call(r'move *.exe ..\..\solvers')
+subprocess.check_call(r'rm -f *.obj')
+subprocess.check_call(r'mv *.exe ../../solvers')
diff --git a/src/solvers/vc10vars32.bat b/src/solvers/vc10vars32.bat
new file mode 100644
index 0000000..a474fa9
--- /dev/null
+++ b/src/solvers/vc10vars32.bat
@@ -0,0 +1,123 @@
+ at echo Setting environment for using Microsoft Visual Studio 2010 x86 tools.
+
+ at call :GetVSCommonToolsDir
+ at if "%VS100COMNTOOLS%"=="" goto error_no_VS100COMNTOOLSDIR
+
+ at call "%VS100COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit
+
+ at if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR
+ at if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
+ at if "%FrameworkDir32%"=="" goto error_no_FrameworkDIR32
+ at if "%FrameworkVersion32%"=="" goto error_no_FrameworkVer32
+ at if "%Framework35Version%"=="" goto error_no_Framework35Version
+
+ at set FrameworkDir=%FrameworkDir32%
+ at set FrameworkVersion=%FrameworkVersion32%
+
+ at if not "%WindowsSdkDir%" == "" (
+ set "PATH=%WindowsSdkDir%bin\NETFX 4.0 Tools;%WindowsSdkDir%bin;%PATH%"
+ set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%"
+ set "LIB=%WindowsSdkDir%lib;%LIB%"
+)
+
+ at rem
+ at rem Root of Visual Studio IDE installed files.
+ at rem
+ at set DevEnvDir=%VSINSTALLDIR%Common7\IDE\
+
+ at rem PATH
+ at rem ----
+ at if exist "%VSINSTALLDIR%\Team Tools\Performance Tools" (
+ set "PATH=%VSINSTALLDIR%\Team Tools\Performance Tools;%PATH%"
+)
+ at if exist "%ProgramFiles%\HTML Help Workshop" set PATH=%ProgramFiles%\HTML Help Workshop;%PATH%
+ at if exist "%ProgramFiles(x86)%\HTML Help Workshop" set PATH=%ProgramFiles(x86)%\HTML Help Workshop;%PATH%
+ at set PATH=%VCINSTALLDIR%VCPackages;%PATH%
+ at set PATH=%FrameworkDir%%Framework35Version%;%PATH%
+ at set PATH=%FrameworkDir%%FrameworkVersion%;%PATH%
+ at set PATH=%VSINSTALLDIR%Common7\Tools;%PATH%
+ at set PATH=%VCINSTALLDIR%BIN;%PATH%
+ at set PATH=%DevEnvDir%;%PATH%
+
+ at if exist "%VSINSTALLDIR%VSTSDB\Deploy" (
+ set "PATH=%VSINSTALLDIR%VSTSDB\Deploy;%PATH%"
+)
+
+ at if not "%FSHARPINSTALLDIR%" == "" (
+ set "PATH=%FSHARPINSTALLDIR%;%PATH%"
+)
+
+ at rem INCLUDE
+ at rem -------
+ at if exist "%VCINSTALLDIR%ATLMFC\INCLUDE" set INCLUDE=%VCINSTALLDIR%ATLMFC\INCLUDE;%INCLUDE%
+ at set INCLUDE=%VCINSTALLDIR%INCLUDE;%INCLUDE%
+
+ at rem LIB
+ at rem ---
+ at if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIB=%VCINSTALLDIR%ATLMFC\LIB;%LIB%
+ at set LIB=%VCINSTALLDIR%LIB;%LIB%
+
+ at rem LIBPATH
+ at rem -------
+ at if exist "%VCINSTALLDIR%ATLMFC\LIB" set LIBPATH=%VCINSTALLDIR%ATLMFC\LIB;%LIBPATH%
+ at set LIBPATH=%VCINSTALLDIR%LIB;%LIBPATH%
+ at set LIBPATH=%FrameworkDir%%Framework35Version%;%LIBPATH%
+ at set LIBPATH=%FrameworkDir%%FrameworkVersion%;%LIBPATH%
+
+ at goto end
+
+ at REM -----------------------------------------------------------------------
+:GetVSCommonToolsDir
+set VS100COMNTOOLS=
+call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1
+if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1
+if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKLM > nul 2>&1
+if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKCU > nul 2>&1
+exit /B 0
+
+:GetVSCommonToolsDirHelper32
+for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO (
+ if "%%i"=="10.0" (
+ SET "VS100COMNTOOLS=%%k"
+ )
+)
+if "%VS100COMNTOOLS%"=="" exit /B 1
+SET "VS100COMNTOOLS=%VS100COMNTOOLS%Common7\Tools\"
+exit /B 0
+
+:GetVSCommonToolsDirHelper64
+for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "10.0"') DO (
+ if "%%i"=="10.0" (
+ SET "VS100COMNTOOLS=%%k"
+ )
+)
+if "%VS100COMNTOOLS%"=="" exit /B 1
+SET "VS100COMNTOOLS=%VS100COMNTOOLS%Common7\Tools\"
+exit /B 0
+
+ at REM -----------------------------------------------------------------------
+:error_no_VS100COMNTOOLSDIR
+ at echo ERROR: Cannot determine the location of the VS Common Tools folder.
+ at goto end
+
+:error_no_VSINSTALLDIR
+ at echo ERROR: Cannot determine the location of the VS installation.
+ at goto end
+
+:error_no_VCINSTALLDIR
+ at echo ERROR: Cannot determine the location of the VC installation.
+ at goto end
+
+:error_no_FrameworkDIR32
+ at echo ERROR: Cannot determine the location of the .NET Framework 32bit installation.
+ at goto end
+
+:error_no_FrameworkVer32
+ at echo ERROR: Cannot determine the version of the .NET Framework 32bit installation.
+ at goto end
+
+:error_no_Framework35Version
+ at echo ERROR: Cannot determine the .NET Framework 3.5 version.
+ at goto end
+
+:end
diff --git a/src/solvers/vcvars32.bat b/src/solvers/vcvars32.bat
new file mode 100644
index 0000000..b9c3523
--- /dev/null
+++ b/src/solvers/vcvars32.bat
@@ -0,0 +1 @@
+"%VS90COMNTOOLS%vsvars32.bat"
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/cain.git
More information about the debian-med-commit
mailing list