source: src/Fragmentation/Summation/AllLevelOrthogonalSummator.hpp@ 87d6bd

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
Last change on this file since 87d6bd was 79398d, checked in by Frederik Heber <heber@…>, 12 years ago

Extended map<IndexSet, MapType> in FragmentResults to a pair of values for both value and contribution.

  • Property mode set to 100644
File size: 4.2 KB
RevLine 
[286e36]1/*
[ff9963]2 * AllLevelOrthogonalSummator.hpp
[286e36]3 *
4 * Created on: 29.07.2012
5 * Author: heber
6 */
7
[ff9963]8#ifndef ALLLEVELORTHOGONALSUMMATOR_HPP_
9#define ALLLEVELORTHOGONALSUMMATOR_HPP_
[286e36]10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16#include <vector>
17
[ff9963]18#include "CodePatterns/Assert.hpp"
19
[286e36]20#include "Fragmentation/Summation/IndexSetContainer.hpp"
21#include "Fragmentation/Summation/SubsetMap.hpp"
[c6ca23]22#include "Fragmentation/Summation/OrthogonalSummator.hpp"
[286e36]23
[1f66c7]24#include "Fragmentation/Summation/printKeyNames.hpp"
[286e36]25
[ff9963]26/** Tiny template functor to use OrthogonalSummation, sum up each level, and store the
27 * result in a given vector.
[286e36]28 *
29 */
30template <typename MapType>
[ff9963]31struct AllLevelOrthogonalSummator {
[c6ca23]32 /** Constructor takes the arguments that \a OrthogonalSummator also needs and stores
[286e36]33 * them internally.
34 *
35 * \param _subsetmap map with hierarchy of IndexSet's
[c9f9bb]36 * \param _data MPQCData converted to MPQCDataMap_t type, associated to the jobid
[286e36]37 * \param _container container of IndexSet's such that each set has correct order
38 * to job id and hence to _data.
39 * \param _MatrixNrLookup lookup from job id to ordering in above vectors
[ff9963]40 * \param _results vector place results into
[286e36]41 */
[ff9963]42 AllLevelOrthogonalSummator(
[286e36]43 SubsetMap::ptr &_subsetmap,
[c9f9bb]44 const std::map<JobId_t, MapType> &_data,
[286e36]45 const IndexSetContainer::Container_t &_container,
[3dd32f]46 const std::map< JobId_t, size_t > &_MatrixNrLookup,
[b8f0b25]47 std::vector<MapType> &_levelresults,
[79398d]48 std::map<IndexSet::ptr, std::pair<MapType, MapType> > &_keysetresults) :
[286e36]49 subsetmap(_subsetmap),
50 data(_data),
51 container(_container),
[ff9963]52 MatrixNrLookup(_MatrixNrLookup),
[b8f0b25]53 levelresults(_levelresults),
54 keysetresults(_keysetresults)
[ff9963]55 {
[b8f0b25]56 ASSERT( levelresults.size() >= subsetmap->getMaximumSetLevel(),
[ff9963]57 "AllLevelOrthogonalSummator() - result vector is not large enough.");
58 }
[286e36]59
[c6ca23]60 /** Operator that calls on OrthogonalSummator and prints the value.
[286e36]61 *
62 * \note the parameter is needed for boost::mpl::for_each but is not
63 * used here.
64 */
65 template <typename MapKey>
66 void operator()(MapKey &) {
67 // We retrieve the type of the MPQCData member variable from the boost::fusion::map.
68 typedef typename boost::fusion::result_of::value_at_key<MapType, MapKey>::type MapValue;
[b8f0b25]69
[c6ca23]70 // create OrthogonalSummator instance
71 OrthogonalSummator<MapType, MapKey> sum_value(
[c9f9bb]72 subsetmap, data, container, MatrixNrLookup
[286e36]73 );
[b8f0b25]74
75 // fill levelresults
[19c50e]76 const size_t MaxLevel = subsetmap->getMaximumSetLevel();
[ff9963]77 for (size_t level=1; level <= MaxLevel; ++level) {
[b8f0b25]78 MapType &LevelResults = levelresults[level-1];
79 // sum up and store in levelresults
[ff9963]80 const MapValue value = sum_value(level);
81 boost::fusion::at_key<MapKey>(LevelResults) = value;
82 // print value
83 //LOG(0, "STATUS: Level " << level << " resulting " << printKeyNames::printName<MapKey>() << " is " << value << ".");
84 }
[b8f0b25]85
86 // fill keysetresults
87 for (IndexSetContainer::Container_t::const_iterator indexsetiter = container.begin();
88 indexsetiter != container.end(); ++indexsetiter) {
89 const IndexSet::ptr &index = *indexsetiter;
90 // this either generates a new entry or updates the present one, as we obtain ref to value
[79398d]91 boost::fusion::at_key<MapKey>(keysetresults[index].first) =
92 sum_value.getValueForIndexSet(index);
93 boost::fusion::at_key<MapKey>(keysetresults[index].second) =
[b8f0b25]94 sum_value.getContributionForIndexSet(index);
95 }
[286e36]96 }
97
98private:
99 //!> Hierarchy of IndexSet's
100 SubsetMap::ptr &subsetmap;
[c9f9bb]101 //!> map from jobids to data converted from MPQCData
102 const std::map<JobId_t, MapType> &data;
[286e36]103 //!> container with all IndexSet's
104 const IndexSetContainer::Container_t &container;
105 //!> lookup map from job ids to ordering in above vectors
[3dd32f]106 const std::map< JobId_t, size_t > &MatrixNrLookup;
[b8f0b25]107 //!> vector of levelresults
108 std::vector<MapType> &levelresults;
[79398d]109 typedef std::pair< IndexSet::ptr, std::pair<MapType, MapType> > keysetresults_pair_t;
[b8f0b25]110 //!> typedef for map for keyset and each resulting value
[79398d]111 typedef std::map<IndexSet::ptr, std::pair<MapType, MapType> > keysetresults_t;
[b8f0b25]112 //!> map for IndexSet and its associated contribution
113 keysetresults_t &keysetresults;
[286e36]114};
115
[ff9963]116#endif /* ALLLEVELORTHOGONALSUMMATOR_HPP_ */
Note: See TracBrowser for help on using the repository browser.