Changeset 22c4f57


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:
1dd419
Parents:
45f4f96
git-author:
Frederik Heber <heber@…> (07/27/12 12:37:16)
git-committer:
Frederik Heber <heber@…> (11/08/12 13:13:52)
Message:

Added superposeOtherHistogram and implemented thereby operator+=() and operator-=().

  • the logic so far is that the other histogram must not extend beyond the present one.
Location:
src/Fragmentation/Histogram
Files:
4 edited

Legend:

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

    r45f4f96 r22c4f57  
    140140}
    141141
     142void Histogram::superposeOtherHistogram(const Histogram &other, const double prefactor)
     143{
     144  // check that other histogram lays within this one
     145  ASSERT( getLowerEndBin(other.bins.begin()->first) != bins.end(),
     146      "Histogram::superposeOtherHistogram() - other histogram's bins start sooner.");
     147  ASSERT( getHigherEndBin((--other.bins.end())->first) != bins.end(),
     148      "Histogram::superposeOtherHistogram() - other histogram's bins end later.");
     149  // go through each of the other histogram's bins
     150  Bins_t::const_iterator enditer = --other.bins.end(); // (except internal last one)
     151  for (Bins_t::const_iterator biniter = other.bins.begin();
     152      biniter != enditer; /* we advance ourselves in loop */) {
     153    const Bin_t &bin = *biniter;
     154    ++biniter;
     155    const Bin_t &nextbin = *biniter;
     156
     157    LOG(2, "DEBUG: Current bin is " << bin << ", next bin is " << nextbin << ".");
     158    // The bin will in general not fit into one bin in this histogram, but overlap.
     159    // Hence, we determine the contribution of the bin to each bin in this histogram
     160    // its overlaps into and add this weight to the bin.
     161    Bins_t::const_iterator loweriter = getLowerEndBin(bin.first);
     162    Bins_t::const_iterator upperiter = getHigherEndBin(nextbin.first);
     163    ASSERT( loweriter != bins.end(),
     164        "Histogram::superposeOtherHistogram() - lower end is invalid.");
     165    ASSERT( upperiter != bins.end(),
     166        "Histogram::superposeOtherHistogram() - higher end is invalid.");
     167    ASSERT( loweriter->first < upperiter->first,
     168        "Histogram::superposeOtherHistogram() - the bin range is invalid.");
     169    LOG(2, "DEBUG: bin range here is ["
     170        << loweriter->first << ","  << upperiter->first << ").");
     171
     172    // Next, we create a vector of offsets
     173    typedef std::vector< BinLowerEnd > offsets_t;
     174    offsets_t offsets;
     175    {
     176      offsets.push_back(bin.first);
     177      Bins_t::const_iterator iter = loweriter;
     178      for (++iter; iter != upperiter; ++iter)
     179        if (offsets.back() != iter->first)
     180          offsets.push_back(iter->first);
     181      if (offsets.back() != nextbin.first)
     182        offsets.push_back(nextbin.first);
     183      LOG(2, "DEBUG: Offsets are " << offsets << ".");
     184    }
     185
     186    // then, we go through the offsets but the last one and add the respective area
     187    {
     188      offsets_t::const_iterator iter = offsets.begin();
     189      offsets_t::const_iterator nextiter = ++offsets.begin();
     190      for (; iter != --offsets.end(); ++iter, ++nextiter) {
     191        const double length = *nextiter - *iter;
     192        const double weight = bin.second * (length/binwidth);
     193        Bins_t::iterator filliter = getLowerEndBin(*iter);
     194        filliter->second += prefactor * weight;
     195      }
     196    }
     197
     198    {
     199      std::stringstream output;
     200      std::for_each( bins.begin(), bins.end(), PrintPair<Bin_t>(output));
     201      LOG(2, "DEBUG: Bins are after summation " << output.str() << ".");
     202    }
     203  }
     204}
     205
    142206Histogram& Histogram::operator+=(const Histogram &other)
    143207{
     208  superposeOtherHistogram(other, +1.);
    144209  return *this;
    145210}
     
    147212Histogram& Histogram::operator-=(const Histogram &other)
    148213{
     214  superposeOtherHistogram(other, -1.);
    149215  return *this;
    150216}
  • src/Fragmentation/Histogram/Histogram.hpp

    r45f4f96 r22c4f57  
    100100   */
    101101  Bins_t::iterator getHigherEndBin(const double _value);
     102 
     103  /** Helper function that contains all the logic of how to superpose two
     104   * histograms.
     105   *
     106   * Is called by Histogram::operator+=() and Histogram::operator-=()
     107   *
     108   * @param other other histogram
     109   * @param prefactor +1. is then addition, -1. is subtraction.
     110   */
     111  void superposeOtherHistogram(const Histogram &other, const double prefactor);
    102112
    103113  /** Helper function to print BinLowerEnd and BinWeight to a string for every bin.
  • src/Fragmentation/Histogram/unittests/HistogramUnitTest.cpp

    r45f4f96 r22c4f57  
    4343#include "HistogramUnitTest.hpp"
    4444
     45#include <cmath>
     46#include <limits>
     47
    4548#include <boost/assign.hpp>
     49
     50#include "CodePatterns/Assert.hpp"
    4651
    4752#ifdef HAVE_TESTRUNNER
     
    5964void HistogramTest::setUp()
    6065{
     66  // failing asserts should be thrown
     67  ASSERT_DO(Assert::Throw);
     68
    6169  histogram = NULL;
    6270}
     
    194202}
    195203
    196 /** UnitTest for operator+=(), operator-=()
    197  */
    198 void HistogramTest::operator_Test()
    199 {
    200 }
    201 
     204/** UnitTest for superposeOtherHistogram()
     205 */
     206void HistogramTest::superposeOtherHistogram_Test()
     207{
     208  // create two histograms, one is larger
     209  Histogram::samples_t sampled_values;
     210  sampled_values += 1.,2.,3.,4.;
     211  histogram = new Histogram(sampled_values, 4);
     212  Histogram::samples_t more_values;
     213  more_values += 1.75,2.5,3.;
     214  Histogram otherhistogram(more_values, 3);
     215#ifndef NDEBUG
     216  CPPUNIT_ASSERT_THROW ( otherhistogram += *histogram, Assert::AssertionFailure );
     217#endif
     218}
     219
     220/** UnitTest for operator+=()
     221 */
     222void HistogramTest::operatorPlusEqual_Test()
     223{
     224  // create non-empty histograms and sum them
     225  Histogram::samples_t sampled_values;
     226  sampled_values += 1.,2.,3.,4.;
     227  histogram = new Histogram(sampled_values, 4);
     228  Histogram::samples_t more_values;
     229  more_values += 1.75,2.5,3.;
     230  Histogram otherhistogram(more_values, 3);
     231  const double sums = histogram->area() + otherhistogram.area();
     232
     233  // check that sum is now sum of both
     234  *histogram += otherhistogram;
     235  CPPUNIT_ASSERT( fabs(sums - histogram->area()) < std::numeric_limits<double>::epsilon()*1e+1 );
     236}
     237
     238/** UnitTest for operator-=()
     239 */
     240void HistogramTest::operatorMinusEqual_Test()
     241{
     242  // create non-empty histograms and sum them
     243  Histogram::samples_t sampled_values;
     244  sampled_values += 1.,2.,3.,4.;
     245  histogram = new Histogram(sampled_values, 4);
     246  Histogram::samples_t more_values;
     247  more_values += 1.75,2.5,3.;
     248  Histogram otherhistogram(more_values, 3);
     249  const double difference = histogram->area() - otherhistogram.area();
     250
     251  // check that sum is now difference of both
     252  *histogram -= otherhistogram;
     253  CPPUNIT_ASSERT( fabs(difference - histogram->area()) < std::numeric_limits<double>::epsilon()*1e+1 );
     254}
     255
  • src/Fragmentation/Histogram/unittests/HistogramUnitTest.hpp

    r45f4f96 r22c4f57  
    2828    CPPUNIT_TEST ( getHigherEndBin_Test );
    2929    CPPUNIT_TEST ( isEmpty_Test );
    30     CPPUNIT_TEST ( operator_Test );
    3130    CPPUNIT_TEST ( areaTest );
     31    CPPUNIT_TEST ( superposeOtherHistogram_Test );
     32    CPPUNIT_TEST ( operatorPlusEqual_Test );
     33    CPPUNIT_TEST ( operatorMinusEqual_Test );
    3234    CPPUNIT_TEST_SUITE_END();
    3335
     
    3941      void getHigherEndBin_Test();
    4042      void isEmpty_Test();
    41       void operator_Test();
    4243      void areaTest();
     44      void superposeOtherHistogram_Test();
     45      void operatorPlusEqual_Test();
     46      void operatorMinusEqual_Test();
    4347
    4448private:
Note: See TracChangeset for help on using the changeset viewer.