Changeset 1c365e


Ignore:
Timestamp:
Nov 8, 2012, 1:13:52 PM (12 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:
3f6bbb
Parents:
c4fd03
git-author:
Frederik Heber <heber@…> (07/31/12 13:08:48)
git-committer:
Frederik Heber <heber@…> (11/08/12 13:13:52)
Message:

Split getBin into getLowerEndBin() and getHigherEndBin().

  • this functionality is required within the operator+=() and operator-=().
Location:
src/Fragmentation/Histogram
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Histogram/Histogram.cpp

    rc4fd03 r1c365e  
    101101    BinCreator_t BinCreator( *miniter, binwidth );
    102102    std::vector<Bin_t> vectorbins;
    103     // we need one extra bin for getBin()'s find to work properly
     103    // we need one extra bin for get...Bin()'s find to work properly
    104104    vectorbins.resize(CountBins+1, Bin_t( make_pair(0., 0.) ) );
    105105    std::generate( vectorbins.begin(), vectorbins.end(), BinCreator );
     
    111111    // 4. place each sample into bin
    112112    BOOST_FOREACH( double value, samples) {
    113       const Bins_t::iterator biniter = getBin(value);
     113      const Bins_t::iterator biniter = getLowerEndBin(value);
    114114      ASSERT( biniter != bins.end(),
    115115          "Histogram::Histogram() - cannot find bin for value from given samples.");
     
    139139}
    140140
    141 Histogram::Bins_t::iterator Histogram::getBin(const double _value)
     141Histogram::Bins_t::iterator Histogram::getLowerEndBin(const double _value)
    142142{
    143   // \note we may use equal_range as our bins are always sorted
     143  // lower bound returns key that is equal or greater
    144144  Bins_t::iterator iter = bins.lower_bound(_value);
    145   // if we are not on the boundary we have to step back by one
    146145  if (iter != bins.end()) {
    147     if (_value != iter->first)
    148       --iter;
     146    // if we are not on the boundary we always have to step back by one
     147    if (_value != iter->first) {
     148      if (iter != bins.begin()) {
     149          --iter;
     150      } else {
     151        iter = bins.end();
     152      }
     153    } else if (iter == --bins.end()) {
     154      // if we actually are on boundary of "last bin", set to end
     155      iter = bins.end();
     156    }
    149157  }
    150   // if we actually are on boundary of "last bin", set to end
    151   if ((_value == iter->first) && (iter == --bins.end()))
    152       iter = bins.end();
     158  return iter;
     159}
     160
     161Histogram::Bins_t::iterator Histogram::getHigherEndBin(const double _value)
     162{
     163  // upper bound return key that is strictly greater
     164  Bins_t::iterator iter = bins.upper_bound(_value);
     165  // if we are on the boundary we have to step back by one
     166  if (iter != bins.end())
     167    if (_value == iter->first)
     168      if (iter != bins.begin())
     169          --iter;
    153170
    154171  return iter;
  • src/Fragmentation/Histogram/Histogram.hpp

    rc4fd03 r1c365e  
    7474
    7575private:
    76   /** Returns the iterator to the bin into which the \a value fits.
     76  /** Returns the iterator to the bin representing the lower end into which the \a value fits.
    7777   *
    7878   * @param _value value to fit.
    7979   * @return iterator to bin or to bins.end() if not matching
    8080   */
    81   Bins_t::iterator getBin(const double _value);
     81  Bins_t::iterator getLowerEndBin(const double _value);
     82
     83  /** Returns the iterator to the bin representing the upper end into which the \a value fits.
     84   *
     85   * @param _value value to fit.
     86   * @return iterator to bin or to bins.end() if not matching
     87   */
     88  Bins_t::iterator getHigherEndBin(const double _value);
    8289
    8390private:
  • src/Fragmentation/Histogram/unittests/HistogramUnitTest.cpp

    rc4fd03 r1c365e  
    6868}
    6969
    70 /** UnitTest for getBin()
     70/** UnitTest for checking internal state after given samples
    7171 */
    72 void HistogramTest::getBin_Test()
     72void HistogramTest::internalState_Test()
    7373{
    7474  // generate non-empty histogramgram
     
    7979  CPPUNIT_ASSERT_EQUAL( (size_t)4+1, histogram->bins.size() );
    8080  CPPUNIT_ASSERT( histogram->bins.end() != histogram->bins.begin() );
    81   CPPUNIT_ASSERT_EQUAL( 1., histogram->bins.begin()->first );
     81  CPPUNIT_ASSERT_EQUAL( 1., histogram->bins.begin()->second );
     82  CPPUNIT_ASSERT_EQUAL( 0., (--histogram->bins.end())->second );
     83}
     84
     85/** UnitTest for getLowerEndBin()
     86 */
     87void HistogramTest::getLowerEndBin_Test()
     88{
     89  // generate non-empty histogramgram
     90  Histogram::samples_t sampled_values;
     91  sampled_values += 1.,2.,3.,4.;
     92  CPPUNIT_ASSERT_EQUAL( (size_t)4, sampled_values.size() );
     93  histogram = new Histogram(sampled_values, 4);
    8294
    8395  // check values inside
    84   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(1.) );
    85   CPPUNIT_ASSERT_EQUAL( 1., histogram->getBin(1.)->first );
    86   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(2.) );
    87   CPPUNIT_ASSERT_EQUAL( 2., histogram->getBin(2.)->first );
    88   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(3.) );
    89   CPPUNIT_ASSERT_EQUAL( 3., histogram->getBin(3.)->first );
    90   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(4.) );
    91   CPPUNIT_ASSERT_EQUAL( 4., histogram->getBin(4.)->first );
    92   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(1.5) );
    93   CPPUNIT_ASSERT_EQUAL( 1., histogram->getBin(1.5)->first );
    94   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(2.5) );
    95   CPPUNIT_ASSERT_EQUAL( 2., histogram->getBin(2.5)->first );
    96   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(3.5) );
    97   CPPUNIT_ASSERT_EQUAL( 3., histogram->getBin(3.5)->first );
    98   CPPUNIT_ASSERT( histogram->bins.end() != histogram->getBin(4.5) );
    99   CPPUNIT_ASSERT_EQUAL( 4., histogram->getBin(4.5)->first );
     96  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(1.) );
     97  CPPUNIT_ASSERT_EQUAL( 1., histogram->getLowerEndBin(1.)->first );
     98  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(2.) );
     99  CPPUNIT_ASSERT_EQUAL( 2., histogram->getLowerEndBin(2.)->first );
     100  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(3.) );
     101  CPPUNIT_ASSERT_EQUAL( 3., histogram->getLowerEndBin(3.)->first );
     102  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(4.) );
     103  CPPUNIT_ASSERT_EQUAL( 4., histogram->getLowerEndBin(4.)->first );
     104  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(1.5) );
     105  CPPUNIT_ASSERT_EQUAL( 1., histogram->getLowerEndBin(1.5)->first );
     106  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(2.5) );
     107  CPPUNIT_ASSERT_EQUAL( 2., histogram->getLowerEndBin(2.5)->first );
     108  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(3.5) );
     109  CPPUNIT_ASSERT_EQUAL( 3., histogram->getLowerEndBin(3.5)->first );
     110  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getLowerEndBin(4.5) );
     111  CPPUNIT_ASSERT_EQUAL( 4., histogram->getLowerEndBin(4.5)->first );
    100112
    101113  // check values outside
    102   CPPUNIT_ASSERT( histogram->bins.end() == histogram->getBin(.9) );
    103   CPPUNIT_ASSERT( histogram->bins.end() == histogram->getBin(5.01) );
    104   CPPUNIT_ASSERT( histogram->bins.end() == histogram->getBin(5.) );
     114  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getLowerEndBin(.9) );
     115  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getLowerEndBin(5.01) );
     116  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getLowerEndBin(5.) );
    105117}
    106118
    107 /** UnitTest for isEmpty
     119/** UnitTest for getHigherEndBin()
     120 */
     121void HistogramTest::getHigherEndBin_Test()
     122{
     123  // generate non-empty histogramgram
     124  Histogram::samples_t sampled_values;
     125  sampled_values += 1.,2.,3.,4.;
     126  CPPUNIT_ASSERT_EQUAL( (size_t)4, sampled_values.size() );
     127  histogram = new Histogram(sampled_values, 4);
     128
     129  // check values inside
     130  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(.5) );
     131  CPPUNIT_ASSERT_EQUAL( 1., histogram->getHigherEndBin(.5)->first );
     132  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(1.) );
     133  CPPUNIT_ASSERT_EQUAL( 2., histogram->getHigherEndBin(1.)->first );
     134  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(2.) );
     135  CPPUNIT_ASSERT_EQUAL( 3., histogram->getHigherEndBin(2.)->first );
     136  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(3.) );
     137  CPPUNIT_ASSERT_EQUAL( 4., histogram->getHigherEndBin(3.)->first );
     138  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(4.) );
     139  CPPUNIT_ASSERT_EQUAL( 5., histogram->getHigherEndBin(4.)->first );
     140  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getHigherEndBin(5.) );
     141  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(1.5) );
     142  CPPUNIT_ASSERT_EQUAL( 2., histogram->getHigherEndBin(1.5)->first );
     143  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(2.5) );
     144  CPPUNIT_ASSERT_EQUAL( 3., histogram->getHigherEndBin(2.5)->first );
     145  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(3.5) );
     146  CPPUNIT_ASSERT_EQUAL( 4., histogram->getHigherEndBin(3.5)->first );
     147  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(4.5) );
     148  CPPUNIT_ASSERT_EQUAL( 5., histogram->getHigherEndBin(4.5)->first );
     149  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getHigherEndBin(5.5) );
     150
     151  // check values outside
     152  CPPUNIT_ASSERT( histogram->bins.end() != histogram->getHigherEndBin(-.1) );
     153  CPPUNIT_ASSERT_EQUAL( 1., histogram->getHigherEndBin(-.1)->first );
     154  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getHigherEndBin(5.01) );
     155  CPPUNIT_ASSERT( histogram->bins.end() == histogram->getHigherEndBin(5.) );
     156}
     157
     158/** UnitTest for isEmpty()
    108159 */
    109160void HistogramTest::isEmpty_Test()
  • src/Fragmentation/Histogram/unittests/HistogramUnitTest.hpp

    rc4fd03 r1c365e  
    2424{
    2525    CPPUNIT_TEST_SUITE( HistogramTest) ;
    26     CPPUNIT_TEST ( getBin_Test );
     26    CPPUNIT_TEST ( internalState_Test );
     27    CPPUNIT_TEST ( getLowerEndBin_Test );
     28    CPPUNIT_TEST ( getHigherEndBin_Test );
    2729    CPPUNIT_TEST ( isEmpty_Test );
    2830    CPPUNIT_TEST ( operator_Test );
     
    3234      void setUp();
    3335      void tearDown();
    34       void getBin_Test();
     36      void internalState_Test();
     37      void getLowerEndBin_Test();
     38      void getHigherEndBin_Test();
    3539      void isEmpty_Test();
    3640      void operator_Test();
Note: See TracChangeset for help on using the changeset viewer.