Changeset 076a77 for src


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:
9b3476
Parents:
1d5a871
git-author:
Frederik Heber <heber@…> (01/05/11 11:13:54)
git-committer:
Frederik Heber <heber@…> (02/03/11 09:51:19)
Message:

RandomNumberGeneratorFactory nows uses Clone instead of Creator pattern.

  • requires CodePatterns 1.0.4.
  • RandomNumberGenerator_Encapsulation implements clone() with calls the constructor ...
  • ... who in turn (sadly) needs some evil dynamic_cast to get the complex type from the simple interface, because we need access to true engine and distribution. The instances themselves are obtained properly from the respective factories. However, the constructor is protected now.
  • FIX: friend classes can actually be forward declared.
Location:
src/RandomNumbers
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/RandomNumbers/RandomNumberDistribution_Encapsulation.hpp

    r1d5a871 r076a77  
    3838#include "RandomNumberDistribution.hpp"
    3939
    40 #include "RandomNumberGeneratorFactory.hpp"
    41 #include "unittests/RandomNumberGeneratorFactoryUnitTest.hpp"
    42 
    4340/** Template class that encapsulates the random number distributions from
    4441 *  random::boost.
     
    5653  >
    5754{
    58   /**
    59    * Factory is friend such that it can access private cstor.
    60    */
    61   friend class RandomNumberGeneratorFactory;
    62   friend class RandomNumberGeneratorFactoryTest;
    63 
    6455public:
    6556
  • src/RandomNumbers/RandomNumberEngine_Encapsulation.hpp

    r1d5a871 r076a77  
    3434#include "RandomNumberEngine.hpp"
    3535
    36 //#include "RandomNumberGeneratorFactory.hpp"
    37 //#include "unittests/RandomNumberGeneratorFactoryUnitTest.hpp"
    38 
    39 class RandomNumberGeneratorFactory;
    40 class RandomNumberGeneratorFactoryTest;
    41 
    4236/** Template class that encapsulates the random number engines from
    4337 *  random::boost.
     
    5549  >
    5650{
    57   /**
    58    * Factory is friend such that it can access private cstor.
    59    */
    60   friend class RandomNumberGeneratorFactory;
    61   friend class RandomNumberGeneratorFactoryTest;
    62 
    6351public:
    6452  /** Set the engine's seed.
  • src/RandomNumbers/RandomNumberGeneratorFactory.cpp

    r1d5a871 r076a77  
    5555      !GeneratorPrototypeTable.empty();
    5656      iter = GeneratorPrototypeTable.begin()) {
    57     EmptyPrototypeTable< std::map<RandomNumberDistributionFactory::TypeList,ICreator<RandomNumberGenerator> *> > (iter->second);
     57    EmptyPrototypeTable< std::map<RandomNumberDistributionFactory::TypeList,Clone<RandomNumberGenerator> *> > (iter->second);
    5858    GeneratorPrototypeTable.erase(iter);
    5959  }
     
    7171  BOOST_PP_SEQ_FOR_EACH_PRODUCT(SequenceElementizer, (engine_seq_a)(distribution_seq))
    7272
    73 #define suffixseq ()(<> > )
     73#define suffixseq ()(<>)
    7474#define tableseq (*EnginePrototypeTable)(*DistributionPrototypeTable)
    7575#define name_spaces_seq (RandomNumberEngineFactory::)(RandomNumberDistributionFactory::)
     
    9191#define ParamItemPrinter(z,n,sequence)
    9292
    93 #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_multidimmap(~, n, size_tupels, distributionengine_seqseq, GeneratorPrototypeTable, TableItemPrinter, new Creator< RandomNumberGenerator BOOST_PP_COMMA() RandomNumberGenerator_Encapsulation , TemplateItemPrinter, ParamItemPrinter)
     93#define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_multidimmap(~, n, size_tupels, distributionengine_seqseq, GeneratorPrototypeTable, TableItemPrinter, new RandomNumberGenerator_Encapsulation , TemplateItemPrinter, ParamItemPrinter)
    9494#define BOOST_PP_LOCAL_LIMITS  (0, BOOST_PP_SEQ_SIZE(distributionengine_seqseq)-1 )
    9595#include BOOST_PP_LOCAL_ITERATE()
    9696
    97 #define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_multidimmap(~, n, size_tupels, distributionengine_seqseq_a, GeneratorPrototypeTable, TableItemPrinter, new Creator< RandomNumberGenerator BOOST_PP_COMMA() RandomNumberGenerator_Encapsulation , TemplateItemPrinter, ParamItemPrinter)
     97#define BOOST_PP_LOCAL_MACRO(n) seqitems_as_enum_key_multidimmap(~, n, size_tupels, distributionengine_seqseq_a, GeneratorPrototypeTable, TableItemPrinter, new RandomNumberGenerator_Encapsulation , TemplateItemPrinter, ParamItemPrinter)
    9898#define BOOST_PP_LOCAL_LIMITS  (0, BOOST_PP_SEQ_SIZE(distributionengine_seqseq_a)-1 )
    9999#include BOOST_PP_LOCAL_ITERATE()
     
    103103{
    104104  // Instantiate and return (implicitly creates a copy of the stored prototype)
    105   return (GeneratorPrototypeTable[engine][distribution]->create());
     105  return (GeneratorPrototypeTable[engine][distribution]->clone());
    106106}
    107107
     
    123123  } else
    124124    dis_type = distribution;
    125   return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->create());
     125  return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
    126126}
    127127
  • src/RandomNumbers/RandomNumberGeneratorFactory.hpp

    r1d5a871 r076a77  
    1515
    1616#include "CodePatterns/Singleton.hpp"
     17
     18#include "CodePatterns/Clone.hpp"
    1719
    1820#include "RandomNumberDistributionFactory.hpp"
     
    99101      std::map<
    100102        RandomNumberDistributionFactory::TypeList,
    101         ICreator<RandomNumberGenerator> *>
     103        Clone<RandomNumberGenerator> *>
    102104  > EngineDistributionTable;
    103105
  • src/RandomNumbers/RandomNumberGenerator_Encapsulation.hpp

    r1d5a871 r076a77  
    4848#include <typeinfo>
    4949
    50 #include "CodePatterns/Creator.hpp"
     50#include "CodePatterns/Clone.hpp"
     51#include "RandomNumberDistribution_Encapsulation.hpp"
     52#include "RandomNumberDistributionFactory.hpp"
     53#include "RandomNumberEngine_Encapsulation.hpp"
     54#include "RandomNumberEngineFactory.hpp"
    5155#include "RandomNumberGenerator.hpp"
    5256
    53 #include "RandomNumberGeneratorFactory.hpp"
    54 #include "unittests/RandomNumberGeneratorFactoryUnitTest.hpp"
     57class RandomNumberGeneratorFactory;
    5558
    5659/** Template class that encapsulates the random number generators from
     
    6467 * might be integer or even a discrete distribution of integers.
    6568 *
    66  * We need three template parameters:
    67  * -# the generator - generates uniform random numbers
     69 * We need two template parameters:
     70 * -# the engine - generates uniform random numbers
    6871 * -# the distribution - transforms uniform into a desired distribution
    6972 */
     
    7174class RandomNumberGenerator_Encapsulation :
    7275  public RandomNumberGenerator,
    73   public Creator<
    74     RandomNumberGenerator,
    75     RandomNumberGenerator_Encapsulation<engine, distribution>
    76   >
     76  public Clone<RandomNumberGenerator>
    7777{
    7878  /**
    79    * Factory is friend such that it can access private cstor.
     79   * Factory is friend such that it can access private cstor when filling its
     80   * table
    8081   */
    8182  friend class RandomNumberGeneratorFactory;
    82   friend class RandomNumberGeneratorFactoryTest;
    83 
    84   friend class Creator< RandomNumberGenerator, RandomNumberGenerator_Encapsulation<engine, distribution> >;
    8583
    8684public:
     
    8987   */
    9088  double operator()() const {
    91     return randomgenerator();
     89    return (*randomgenerator)();
    9290  }
    9391
     
    9795   */
    9896  void seed(unsigned int _seed) {
    99     engine_type.seed(_seed);
     97    engine_type->seed(_seed);
    10098  }
    10199
     
    104102   */
    105103  std::string EngineName() {
    106     return typeid(engine_type).name();
     104    return engine_type->name();
    107105  }
    108106
     
    111109   */
    112110  std::string DistributionName() {
    113     return typeid(distribution_type).name();
     111    return distribution_type->name();
     112  }
     113
     114  /** Clones the current instance and returns pointer.
     115   *
     116   * @return pointer to cloned instance
     117   */
     118  RandomNumberGenerator* clone() const
     119  {
     120    RandomNumberGenerator_Encapsulation<engine, distribution> *MyClone = NULL;
     121
     122    // sadly (due to construction of variate_generator without any abstract
     123    // base class) we need RTTI here ...
     124    RandomNumberEngine *engine_clone =
     125        RandomNumberEngineFactory::getInstance().getProduct(typeid(engine));
     126    RandomNumberDistribution *distribution_clone =
     127        RandomNumberDistributionFactory::getInstance().getProduct(typeid(distribution));
     128
     129    MyClone = new RandomNumberGenerator_Encapsulation<engine, distribution>(
     130        engine_clone,
     131        distribution_clone
     132        );
     133
     134    return MyClone;
     135  }
     136
     137protected:
     138  /** Constructor that instantiates a specific random number generator and
     139   * distribution.
     140   *
     141   * This is one is supposed to create the prototypes. Hence, must only be
     142   * called from the factory.
     143   */
     144  RandomNumberGenerator_Encapsulation() :
     145    engine_type(NULL),
     146    distribution_type(NULL),
     147    randomgenerator(NULL)
     148  {
     149    engine_type = RandomNumberEngineFactory::getInstance().getProduct(typeid(engine));
     150    distribution_type = RandomNumberDistributionFactory::getInstance().getProduct(typeid(distribution));
     151    randomgenerator = new boost::variate_generator<engine, distribution>(
     152        (dynamic_cast<RandomNumberEngine_Encapsulation<engine> *>(engine_type))
     153        ->getEngine(),
     154        (dynamic_cast<RandomNumberDistribution_Encapsulation<distribution> *>(distribution_type))
     155        ->getDistribution());
    114156  }
    115157
    116158  /** Constructor that instantiates a specific random number generator and
    117159   * distribution.
    118    * @param _generator_type instance of the desired generator
     160   * @param _engine_type instance of the desired generator
    119161   * @param _distribution_type instance of the desired distribution
    120162   */
    121   RandomNumberGenerator_Encapsulation() :
     163  RandomNumberGenerator_Encapsulation(
     164      RandomNumberEngine *_engine_type,
     165      RandomNumberDistribution *_distribution_type
     166      ) :
     167    engine_type(_engine_type),
     168    distribution_type(_distribution_type),
    122169    randomgenerator(
    123         boost::variate_generator<engine, distribution> (
    124             engine_type,
    125             distribution_type)
    126         )
     170        new boost::variate_generator<engine, distribution> (
     171            (dynamic_cast<RandomNumberEngine_Encapsulation<engine> *>(engine_type))
     172            ->getEngine(),
     173            (dynamic_cast<RandomNumberDistribution_Encapsulation<distribution> *>(distribution_type))
     174            ->getDistribution())
     175    )
    127176  {}
    128177
     
    130179   *
    131180   */
    132   virtual ~RandomNumberGenerator_Encapsulation() {}
     181  virtual ~RandomNumberGenerator_Encapsulation()
     182  {
     183    // NULL pointer may be deleted
     184    delete engine_type;
     185    delete distribution_type;
     186    delete randomgenerator;
     187  }
     188protected:
     189  RandomNumberEngine *engine_type;
     190  RandomNumberDistribution *distribution_type;\
    133191private:
    134   engine engine_type;
    135   distribution distribution_type;
    136   mutable boost::variate_generator<engine, distribution> randomgenerator;
     192  mutable boost::variate_generator<engine, distribution> *randomgenerator;
    137193};
    138194
  • src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.cpp

    r1d5a871 r076a77  
    7575void RandomNumberGeneratorFactoryTest::setUp()
    7676{
     77  rng = NULL;
     78
    7779  RandomNumberGeneratorFactory::getInstance();
    7880}
     
    8082void RandomNumberGeneratorFactoryTest::tearDown()
    8183{
     84  delete rng;
     85
    8286  RandomNumberDistributionFactory::purgeInstance();
    8387  RandomNumberEngineFactory::purgeInstance();
     
    8791void RandomNumberGeneratorFactoryTest::GeneratorTest()
    8892{
    89   RandomNumberGenerator *rng = NULL;
    9093  // check one of the engines and distributions
    9194  rng = RandomNumberGeneratorFactory::getInstance().
    9295      GeneratorPrototypeTable[RandomNumberEngineFactory::minstd_rand0]
    93                               [RandomNumberDistributionFactory::uniform_smallint]->create();
     96                              [RandomNumberDistributionFactory::uniform_smallint]->clone();
    9497  CPPUNIT_ASSERT_EQUAL(
    9598      std::string(typeid(boost::minstd_rand0).name()),
     
    100103      rng->DistributionName()
    101104  );
    102   delete rng;
    103 
    104105}
    105 
  • src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.hpp

    r1d5a871 r076a77  
    1414#endif
    1515
     16class RandomNumberGenerator;
    1617
    1718#include <cppunit/extensions/HelperMacros.h>
     
    3031
    3132private:
     33  RandomNumberGenerator *rng;
    3234};
    3335
Note: See TracChangeset for help on using the changeset viewer.