Changeset 30abdc


Ignore:
Timestamp:
Nov 8, 2012, 1:13:13 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:
c508fea
Parents:
7bed4e
git-author:
Frederik Heber <heber@…> (07/04/12 15:31:42)
git-committer:
Frederik Heber <heber@…> (11/08/12 13:13:13)
Message:

SetValue now has a contribution along with its value.

  • contribution is Cacheable and new function calcSum() which is called when contribution is accessed.
  • operator+=/-=() are now OBSERVEd, too.
  • adapted unit test to check whether contribution is working.
  • added two mocks for SubsetMap and SetValueMap.
Location:
src/Fragmentation/Summation
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • src/Fragmentation/Summation/SetValue.hpp

    r7bed4e r30abdc  
    1515#endif
    1616
     17#include <boost/function.hpp>
     18#include <boost/shared_ptr.hpp>
     19
    1720#include "IndexSet.hpp"
     21#include "IndexSetContainer.hpp"
    1822
     23#include "CodePatterns/Cacheable.hpp"
     24#include "CodePatterns/Log.hpp"
    1925#include "CodePatterns/Observer/Observable.hpp"
     26
     27class SetValueTest;
    2028
    2129template <class T>
    2230class SetValue : public Observable
    2331{
     32  //!> grant unit test access to allow setting static function
     33  friend class SetValueTest;
    2434public:
    25   SetValue(const IndexSet &_indices, const T &_value) :
     35  typedef boost::shared_ptr< SetValue<T> > ptr;
     36
     37  SetValue(const IndexSet_ptr &_indices, const T &_value) :
    2638    Observable("SubsetValue"),
    2739    value(_value),
    28     indices(_indices)
     40    indices(_indices),
     41    contribution(this,boost::bind(&SetValue<T>::calcSum,this),"contribution")
    2942  {};
    3043
    3144  SetValue & operator+=(const SetValue &other) {
    32     if (indices.contains(other.indices))
     45    if (indices->contains(*other.indices)) {
     46      OBSERVE;
    3347      value += other.value;
     48    }
    3449    return *this;
    3550  }
    3651
    3752  SetValue & operator-=(const SetValue &other) {
    38     if (indices.contains(other.indices))
     53    if (indices->contains(*other.indices)) {
     54      OBSERVE;
    3955      value -= other.value;
     56    }
    4057    return *this;
    4158  }
    4259
    43   const IndexSet& getIndexSet() const {
     60  const IndexSet_ptr& getIndexSet() const {
    4461    return indices;
    4562  }
    4663
     64  /** Getter for the contribution.
     65   *
     66   * @return contribution
     67   */
     68  const T getContribution() const {
     69    return *contribution;
     70  }
     71
     72  /** Getter for the value.
     73   *
     74   * @return value
     75   */
    4776  const T getValue() const {
    4877    return value;
    4978  }
    5079
     80  /** Setter for the value.
     81   *
     82   * This function is observed to notify all sets that contain us of a change.
     83   *
     84   * @param _value value to set value to
     85   */
    5186  void setValue(const T& _value) {
    5287    OBSERVE;
     
    5994
    6095private:
     96  //!> static lookup function to get to the subsets
     97  static boost::function< IndexSetContainer::ptr & (const IndexSet_ptr &)> lookupSubset;
     98
     99  //!> static lookup function to get the SetValue for a specific IndexSet
     100  static boost::function< typename SetValue<T>::ptr & (const IndexSet_ptr &)> lookupValue;
     101
     102  /** Calculates the contribution for this subset.
     103   *
     104   * Internal function that is bound to the cacheable
     105   *
     106   * @return
     107   */
     108  const T calcSum() {
     109    LOG(1, "INFO: Summing up contribution for " << *indices << ".");
     110    // we initialize with value
     111    T result = getValue();
     112    // then subtract contributions from all subsets
     113    const IndexSetContainer::ptr &container = lookupSubset(indices);
     114    if (container) {
     115      const IndexSetContainer::Container_t &subsets = container->getContainer();
     116      for (IndexSetContainer::Container_t::const_iterator iter = subsets.begin();
     117          iter != subsets.end(); ++iter) {
     118        LOG(2, "INFO: Current subset is " << **iter << ".");
     119        // NOTE: our subset is not contained in the number of subsets
     120        typename SetValue<T>::ptr ptr = lookupValue(*iter);
     121        if (ptr)
     122          result -= ptr->getContribution();
     123        else
     124          ELOG(1, "Cannot find " << **iter << " via lookup.");
     125      }
     126    } else {
     127      ELOG(1, "Cannot find subsets for " << *indices << " via lookup.");
     128    }
     129    return result;
     130  }
     131
     132private:
    61133  //!> value associated with this IndexSet
    62134  T value;
    63135
    64   //!> reference to the index set
    65   const IndexSet &indices;
     136  //!> shared_ptr to the index set
     137  IndexSet_ptr indices;
     138
     139  //!> stores the (orthogonal) contribution for this SubsetValue
     140  Cacheable<T> contribution;
    66141};
    67142
     143template <class T>
     144boost::function< IndexSetContainer::ptr & (const IndexSet_ptr &)> SetValue<T>::lookupSubset = NULL;
     145
     146template <class T>
     147boost::function< typename SetValue<T>::ptr & (const IndexSet_ptr &)> SetValue<T>::lookupValue = NULL;
    68148
    69149#endif /* SETVALUE_HPP_ */
  • src/Fragmentation/Summation/unittests/Makefile.am

    r7bed4e r30abdc  
    5252        unittests/SetValueUnitTest.cpp \
    5353        unittests/SetValueUnitTest.hpp \
     54        unittests/stubs/SetValueMap_Mock.hpp \
     55        unittests/stubs/SubsetMap_Mock.hpp \
     56        IndexSet.cpp \
     57        IndexSet.hpp \
     58        IndexSetContainer.hpp \
    5459        SetValue.hpp
    5560SetValueUnitTest_LDADD = ${FRAGMENTATIONSUMMATIONLIBS}
  • src/Fragmentation/Summation/unittests/SetValueUnitTest.cpp

    r7bed4e r30abdc  
    3939#include <cppunit/ui/text/TestRunner.h>
    4040
     41#include "Fragmentation/Summation/IndexSet.hpp"
     42#include "Fragmentation/Summation/IndexSetContainer.hpp"
    4143#include "Fragmentation/Summation/SetValue.hpp"
    4244
    4345#include "SetValueUnitTest.hpp"
     46#include "stubs/SetValueMap_Mock.hpp"
     47#include "stubs/SubsetMap_Mock.hpp"
    4448
    4549#include <boost/assign.hpp>
     
    5862CPPUNIT_TEST_SUITE_REGISTRATION( SetValueTest );
    5963
     64LookupValue LV;
     65LookupSubset LS;
     66
    6067
    6168void SetValueTest::setUp()
     
    6370  IndexSet set;
    6471  set += 1,2,3,4;
    65   indices = new IndexSet( set );
    66   value = new SetValue<int>(*indices, VALUE);
     72  indices.reset(new IndexSet( set ));
     73  value.reset(new SetValue<int>(indices, VALUE));
     74  SetValue<int>::lookupSubset =
     75      boost::bind(&LookupSubset::getSubsets, boost::ref(LS), _1);
     76  SetValue<int>::lookupValue =
     77      boost::bind(&LookupValue::getValue, boost::ref(LV), _1);
     78  LV.LookupMap.insert( std::make_pair(indices, value) );
     79  //IndexSet_ptr emptyset(new IndexSet);
     80  //LS.LookupMap.insert( std::make_pair(indices, IndexSetContainer::ptr( new IndexSetContainer(emptyset) )) );
    6781};
    6882
     
    7084void SetValueTest::tearDown()
    7185{
    72   delete value;
    73   delete indices;
    7486};
    7587
     
    8799void SetValueTest::operatorTest()
    88100{
    89   SetValue<int> other(*indices, OTHER);
     101  SetValue<int> other(indices, OTHER);
    90102
    91103  // operator-=
     
    99111  CPPUNIT_ASSERT_EQUAL( (int)VALUE - ((int)OTHER - (int)VALUE), value->getValue() );
    100112};
     113
     114void SetValueTest::getContributiontest()
     115{
     116  IndexSet set;
     117  set += 1,2,3;
     118  IndexSet_ptr otherindices(new IndexSet(set));
     119  SetValue<int>::ptr othervalue(new SetValue<int>(otherindices, OTHER));
     120  LV.LookupMap.insert( std::make_pair(otherindices, othervalue) );
     121
     122  // connect as subset
     123  LS.LookupMap[indices].reset(new IndexSetContainer(otherindices));
     124
     125  std::cout << "The following error is intended and does not constitute a failure of the test." << std::endl;
     126  CPPUNIT_ASSERT_EQUAL( (int)OTHER, othervalue->getContribution() );
     127  CPPUNIT_ASSERT_EQUAL( 2, value->getContribution() );
     128
     129  LS.LookupMap.erase( indices );
     130}
  • src/Fragmentation/Summation/unittests/SetValueUnitTest.hpp

    r7bed4e r30abdc  
    1717#include <cppunit/extensions/HelperMacros.h>
    1818
     19#include "Fragmentation/Summation/IndexSet.hpp"
    1920#include "Fragmentation/Summation/SetValue.hpp"
    20 
    21 class IndexSet;
    2221
    2322/********************************************** Test classes **************************************/
     
    2827    CPPUNIT_TEST ( constructorTest );
    2928    CPPUNIT_TEST ( operatorTest );
     29    CPPUNIT_TEST ( getContributiontest );
    3030    CPPUNIT_TEST_SUITE_END();
    3131
     
    3535      void constructorTest();
    3636      void operatorTest();
     37      void getContributiontest();
    3738
    3839private:
    39       IndexSet *indices;
    40       SetValue<int> *value;
     40      IndexSet::ptr indices;
     41      SetValue<int>::ptr value;
    4142
    4243};
Note: See TracChangeset for help on using the changeset viewer.