Changeset 63839f for src


Ignore:
Timestamp:
Feb 3, 2011, 9:59:58 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:
a5028f
Parents:
5347cd
git-author:
Frederik Heber <heber@…> (01/15/11 14:38:57)
git-committer:
Frederik Heber <heber@…> (02/03/11 09:59:58)
Message:

RandomNumberGeneratorFactory does not clone anymore.

  • cloning of the generator was nonsense, as (because of same seed), we always start at same random number sequence. I.e. if we often obtain new random number generator we hardly get random numbers.
  • RandomNumberGeneratorFactory::makeRandomNumberGenerator() returns now reference to avoid accidental free'ing of the instance (that is still contained in the prototype table of the factory).
  • unit test of RandomNumberGenerator now checks for non-copy received.
  • RandomNumberGenerator()::get...Name() are now const members.
  • in many cases where pointer *rng was received and ref &random obtained from it, we now receive ref directly (and then don't accidentally forget to delete the clone anymore. Which is good in any case!).
Location:
src/RandomNumbers
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • src/RandomNumbers/RandomNumberGenerator.hpp

    r5347cd r63839f  
    5454   *
    5555   */
    56   virtual std::string EngineName()=0;
     56  virtual std::string EngineName() const=0;
    5757
    5858  /** Getter for the type name of the internal distribution.
    5959   *
    6060   */
    61   virtual std::string DistributionName()=0;
     61  virtual std::string DistributionName() const=0;
    6262
    6363  /** Destructor of class RandomNumberGenerator.
  • src/RandomNumbers/RandomNumberGeneratorFactory.cpp

    r5347cd r63839f  
    5555      !GeneratorPrototypeTable.empty();
    5656      iter = GeneratorPrototypeTable.begin()) {
    57     EmptyPrototypeTable< std::map<RandomNumberDistributionFactory::TypeList,Clone<RandomNumberGenerator> *> > (iter->second);
     57    EmptyPrototypeTable< std::map<RandomNumberDistributionFactory::TypeList,RandomNumberGenerator*> > (iter->second);
    5858    GeneratorPrototypeTable.erase(iter);
    5959  }
     
    100100}
    101101
    102 RandomNumberGenerator* RandomNumberGeneratorFactory::makeRandomNumberGenerator() const
     102RandomNumberGenerator& RandomNumberGeneratorFactory::makeRandomNumberGenerator() const
    103103{
    104104  // Instantiate and return (implicitly creates a copy of the stored prototype)
     
    108108      RandomNumberDistributionFactory::getInstance().getCurrentTypeEnum();
    109109
    110   return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
     110  return (*GeneratorPrototypeTable[ eng_type ][ dis_type ]);
    111111}
    112112
    113 RandomNumberGenerator* RandomNumberGeneratorFactory::makeRandomNumberGenerator(
     113RandomNumberGenerator& RandomNumberGeneratorFactory::makeRandomNumberGenerator(
    114114    std::string engine_type,
    115115    std::string distribution_type
     
    128128  } else
    129129    dis_type = RandomNumberDistributionFactory::getInstance().getCurrentTypeEnum();
    130   return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
     130  return (*GeneratorPrototypeTable[ eng_type ][ dis_type ]);
    131131
    132   return (GeneratorPrototypeTable[ eng_type ][ dis_type ]->clone());
     132  return (*GeneratorPrototypeTable[ eng_type ][ dis_type ]);
    133133}
    134134
  • src/RandomNumbers/RandomNumberGeneratorFactory.hpp

    r5347cd r63839f  
    5050   * \return random number generator instance
    5151   */
    52   RandomNumberGenerator* makeRandomNumberGenerator() const;
     52  RandomNumberGenerator& makeRandomNumberGenerator() const;
    5353
    5454  /** Create a Generator of desired combination of engine and distribution.
     
    6262   * \return random number generator instance
    6363   */
    64   RandomNumberGenerator* makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
     64  RandomNumberGenerator& makeRandomNumberGenerator(std::string engine_type, std::string distribution_type) const;
    6565
    6666  /** Specify the precise type of the engine to build
     
    9999      std::map<
    100100        RandomNumberDistributionFactory::TypeList,
    101         Clone<RandomNumberGenerator> *>
     101        RandomNumberGenerator *>
    102102  > EngineDistributionTable;
    103103
  • src/RandomNumbers/RandomNumberGenerator_Encapsulation.hpp

    r5347cd r63839f  
    8787   */
    8888  double operator()() const {
    89     return (*randomgenerator)();
     89    const double value = (*randomgenerator)();
     90    //std::cout << "Current random value from (" << EngineName() << "," << DistributionName() << ") is " << value << std::endl;
     91    return value;
    9092  }
    9193
     
    117119   *
    118120   */
    119   std::string EngineName() {
     121  std::string EngineName() const {
    120122    return engine_type->name();
    121123  }
     
    124126   *
    125127   */
    126   std::string DistributionName() {
     128  std::string DistributionName() const {
    127129    return distribution_type->name();
    128130  }
  • src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.cpp

    r5347cd r63839f  
    7575void RandomNumberGeneratorFactoryTest::setUp()
    7676{
    77   rng = NULL;
    78 
    7977  RandomNumberGeneratorFactory::getInstance();
    8078}
     
    8280void RandomNumberGeneratorFactoryTest::tearDown()
    8381{
    84   delete rng;
    8582
    8683  RandomNumberDistributionFactory::purgeInstance();
     
    9289{
    9390  // check one of the engines and distributions
    94   rng = RandomNumberGeneratorFactory::getInstance().
     91  RandomNumberGenerator& rng = *(RandomNumberGeneratorFactory::getInstance().
    9592      GeneratorPrototypeTable[RandomNumberEngineFactory::minstd_rand0]
    96                               [RandomNumberDistributionFactory::uniform_smallint]->clone();
     93                              [RandomNumberDistributionFactory::uniform_smallint]);
    9794  CPPUNIT_ASSERT_EQUAL(
    9895      std::string(typeid(boost::minstd_rand0).name()),
    99       rng->EngineName()
     96      rng.EngineName()
    10097  );
    10198  CPPUNIT_ASSERT_EQUAL(
    10299      std::string(typeid(boost::uniform_smallint<> ).name()),
    103       rng->DistributionName()
     100      rng.DistributionName()
    104101  );
    105102
     
    108105  RandomNumberDistributionFactory::getInstance().setCurrentType(RandomNumberDistributionFactory::uniform_int);
    109106  // ... and check whether generator delivers those set types
    110   RandomNumberGenerator *rng_A = RandomNumberGeneratorFactory::getInstance().
     107  RandomNumberGenerator &rng_A = RandomNumberGeneratorFactory::getInstance().
    111108      makeRandomNumberGenerator();
    112109  CPPUNIT_ASSERT_EQUAL(
    113110      std::string(typeid(boost::minstd_rand0).name()),
    114       rng_A->EngineName()
     111      rng_A.EngineName()
    115112  );
    116113  CPPUNIT_ASSERT_EQUAL(
    117114      std::string(typeid(boost::uniform_int<> ).name()),
    118       rng_A->DistributionName()
     115      rng_A.DistributionName()
    119116  );
    120   delete rng_A;
    121117}
  • src/RandomNumbers/unittests/RandomNumberGeneratorFactoryUnitTest.hpp

    r5347cd r63839f  
    2929
    3030  void GeneratorTest();
    31 
    32 private:
    33   RandomNumberGenerator *rng;
    3431};
    3532
  • src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.cpp

    r5347cd r63839f  
    5050
    5151/** We check that the RandomNumberGenerator instance received
    52  * from the RandomNumberGeneratorFactory is truely a copy and
    53  * not the prototype instance.
     52 * from the RandomNumberGeneratorFactory is truely the prototype
     53 * itself.
    5454 */
    55 void RandomNumberGeneratorTest::PrototypeCopyTest()
     55void RandomNumberGeneratorTest::PrototypeNonCopyTest()
    5656{
    57   RandomNumberGenerator *rng1 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
    58   RandomNumberGenerator *rng2 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
     57  RandomNumberGenerator &rng1 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
     58  RandomNumberGenerator &rng2 = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
    5959
    60   double random1_1 = (*rng1)();
    61   double random1_2 = (*rng1)();
    62   double random2_1 = (*rng2)();
    63   double random2_2 = (*rng2)();
    64 
    65   CPPUNIT_ASSERT(random1_1 == random2_1);
    66   CPPUNIT_ASSERT(random1_2 == random2_2);
    67 
    68   delete rng1;
    69   delete rng2;
     60  // compare addresses in memory, have to be the same
     61  CPPUNIT_ASSERT( &rng1 == &rng2 );
    7062}
    7163
     
    7466  // obtain some random values for uniform_smallint
    7567  RandomNumberGeneratorFactory::getInstance().setDistribution("uniform_smallint");
    76   RandomNumberGenerator* rng = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
     68  RandomNumberGenerator& rng = RandomNumberGeneratorFactory::getInstance().makeRandomNumberGenerator();
    7769  for (size_t i=0; i < 1000; ++i) {
    78     const int testint = (*rng)();
     70    const int testint = rng();
    7971    CPPUNIT_ASSERT_MESSAGE("randon number from uniform_smallint is out of [0:9]!", testint >= 0);
    8072    CPPUNIT_ASSERT_MESSAGE("randon number from uniform_smallint is out of [0:9]!", testint <= 9);
    8173  }
    82   delete rng;
    8374}
  • src/RandomNumbers/unittests/RandomNumberGeneratorUnitTest.hpp

    r5347cd r63839f  
    2020{
    2121  CPPUNIT_TEST_SUITE( RandomNumberGeneratorTest );
    22   CPPUNIT_TEST ( PrototypeCopyTest );
     22  CPPUNIT_TEST ( PrototypeNonCopyTest );
    2323  CPPUNIT_TEST ( Range_uniform_smallint_Test );
    2424  CPPUNIT_TEST_SUITE_END();
     
    2828  void tearDown();
    2929
    30   void PrototypeCopyTest();
     30  void PrototypeNonCopyTest();
    3131  void Range_uniform_smallint_Test();
    3232
Note: See TracChangeset for help on using the changeset viewer.