[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