Ignore:
Timestamp:
Feb 3, 2011, 9:51:19 AM (14 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
1d5a871
Parents:
3f9eba
git-author:
Frederik Heber <heber@…> (01/03/11 14:01:22)
git-committer:
Frederik Heber <heber@…> (02/03/11 09:51:19)
Message:

Bigger rewrite of RandomNumbers ... due to cloning of prototypes.

  • in order to copy the prototypes and not use the original instance, we have implemented a new pattern called "Creator" that wraps a templated class in a creation interface class such that this abstract class can instaniate the particular types (see here http://stackoverflow.com/questions/3506026/c-clone-abstract-base-class-without-meddling-with-derived). This is also wrapped up in ..._Creator.hpp files.
  • meanwhile we also tried to have factories for Engine and Distribution but this failed due to boost::variate_operator<> having to know the particular types of engine and distribution. One could go forth with some cast's but this is very unclean and not what we want. ... Downside is that we can't set global options for engines or distributions as of now.
  • For the moment Engine- and DistributionFactory both have a prototype table, i.e. the same wrapped ones as above, but they are not used for the GeneratorFactory.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/RandomNumbers/RandomNumberGeneratorFactory.hpp

    r3f9eba rc9bc2b7  
    1616#include "CodePatterns/Singleton.hpp"
    1717
    18 #include "RandomNumberDistribution.hpp"
    19 #include "RandomNumberEngine.hpp"
    20 #include "RandomNumberGenerator.hpp"
     18#include "RandomNumberDistributionFactory.hpp"
     19#include "RandomNumberEngineFactory.hpp"
    2120
    2221#include <map>
    2322
    24 #include "TemplatePowerSetGenerator.hpp"
    25 #include "RandomNumberGeneratorFactory.def"
     23#include "RandomNumberGenerator_Creator.hpp"
    2624
    2725#include "unittests/RandomNumberGeneratorFactoryUnitTest.hpp"
     26
     27class RandomNumberGenerator;
    2828
    2929/** This is the abstract factory class for random number generators.
     
    4040  friend class Singleton<RandomNumberGeneratorFactory>;
    4141  friend class RandomNumberGeneratorFactoryTest;
     42
    4243public:
    4344
     
    4748
    4849public:
    49   /** Enumeration of all (pseudo-)random number engines implemented in
    50    *  boost::random, see
    51    *  http://www.boost.org/doc/libs/1_45_0/doc/html/boost_random/reference.html#boost_random.reference.concepts
    52    */
    53   enum Engine {
    54 BOOST_PP_REPEAT( engine_seq_size, seqitems_as_enum, engine_seq)
    55 ,
    56 BOOST_PP_REPEAT( engine_seq_a_size, seqitems_as_enum, engine_seq_a)
    57   };
    58 
    59   /** Enumeration of all distribution implemented in random::boost.
    60    */
    61   enum Distribution {
    62 BOOST_PP_REPEAT( distribution_seq_size, seqitems_as_enum, distribution_seq)
    63   };
    64 
    6550  /** Create a Generator of previously set type.
    6651   *
    6752   * \return random number generator instance
    6853   */
    69   RandomNumberGenerator& makeRandomNumberGenerator() const;
     54  RandomNumberGenerator* makeRandomNumberGenerator() const;
    7055
    7156  /** Create a Generator of desired combination of engine and distribution.
     
    7560   *
    7661   * \param engine_type name of engine, give empty string for current default
    77    * \param distribution_type name of distribution, give empty string for current default
     62   * \param distribution_type name of distribution, give empty string for
     63   *        current default
    7864   * \return random number generator instance
    7965   */
    80   RandomNumberGenerator& makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
     66  RandomNumberGenerator* makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
    8167
    8268  /** Specify the precise type of the engine to build
     
    8672  void setEngine(std::string engine_type);
    8773
    88   /** Getter for current type of engine.
     74  /** Getter for the name of the current type of engine.
    8975   *
    9076   * @return name of engine
    9177   */
    92   const std::string &getEngine() const;
     78  const std::string &getEngineName() const;
    9379
    9480  /** Specify the precise type of the distribution to build
     
    9884  void setDistribution(std::string distribution_type);
    9985
    100   /** Getter for current type of distribution.
     86  /** Getter for the name of the current type of distribution.
    10187   *
    10288   * @return name of distribution
    10389   */
    104   const std::string &getDistribution() const;
     90  const std::string &getDistributionName() const;
    10591
    10692protected:
     
    10995   *  and stores them in \a PrototypeTable.
    11096   */
    111   void FillPrototypeTables();
     97  void FillPrototypeTable();
    11298
    11399  typedef std::map<
    114       std::string,
    115       enum Engine
    116       > EngineMap;
    117   typedef std::map<
    118       enum Engine,
    119       RandomNumberEngine *
    120       > EngineTable;
    121   typedef std::map<
    122       enum Engine,
    123       std::string
    124         > EngineNamesMap;
    125 
    126   typedef std::map<
    127       std::string,
    128       enum Distribution
    129       > DistributionMap;
    130   typedef std::map<
    131       enum Distribution,
    132       RandomNumberDistribution *
    133       > DistributionTable;
    134   typedef std::map<
    135       enum Distribution,
    136       std::string
    137       > DistributionNamesMap;
    138 
    139   typedef std::map<
    140       enum Engine,
     100      enum RandomNumberEngineFactory::Engine,
    141101      std::map<
    142         enum Distribution,
    143         RandomNumberGenerator *>
     102        enum RandomNumberDistributionFactory::Distribution,
     103        IRandomNumberGenerator_Creator *>
    144104  > EngineDistributionTable;
    145105
    146   static enum Engine engine;
    147   static enum Distribution distribution;
    148   static EngineMap engines;
    149   static EngineTable EnginePrototypeTable;
    150   static EngineNamesMap engineNames;
    151   static DistributionMap distributions;
    152   static DistributionTable DistributionPrototypeTable;
    153   static DistributionNamesMap distributionNames;
     106  static enum RandomNumberDistributionFactory::Distribution distribution;
     107  static enum RandomNumberEngineFactory::Engine engine;
    154108  static EngineDistributionTable GeneratorPrototypeTable;
    155109};
    156110
    157 #include "RandomNumberGeneratorFactory.undef"
    158 
    159111#endif /* RANDOMNUMBERGENERATORFACTORY_HPP_ */
Note: See TracChangeset for help on using the changeset viewer.