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.
File:
1 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_ */
Note: See TracChangeset for help on using the changeset viewer.