Ignore:
Timestamp:
Mar 20, 2017, 3:03:17 PM (8 years ago)
Author:
Frederik Heber <heber@…>
Branches:
FitPartialCharges_GlobalError, PartialCharges_OrthogonalSummation
Children:
3607c3
Parents:
5b3781
git-author:
Frederik Heber <heber@…> (06/12/16 19:02:32)
git-committer:
Frederik Heber <heber@…> (03/20/17 15:03:17)
Message:

First version of orthogonal summation of partial charges.

  • implemented directly in FitPartialChargesAction::performCall().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/PotentialAction/FitPartialChargesAction.cpp

    r5b3781 rbb8b0a  
    4949#include <boost/filesystem.hpp>
    5050#include <boost/foreach.hpp>
     51#include <boost/mpl/for_each.hpp>
     52
    5153#include <algorithm>
    5254#include <functional>
     
    6567#include "Fragmentation/Homology/HomologyContainer.hpp"
    6668#include "Fragmentation/Homology/HomologyGraph.hpp"
     69#include "Fragmentation/Summation/Containers/PartialChargesFused.hpp"
     70#include "Fragmentation/Summation/Containers/PartialChargesMap.hpp"
    6771#include "Fragmentation/Summation/SetValues/SamplingGrid.hpp"
     72#include "Fragmentation/Summation/ZeroInstanceInitializer.hpp"
    6873#include "FunctionApproximation/Extractors.hpp"
    6974#include "Potentials/PartialNucleiChargeFitter.hpp"
     
    400405}
    401406
     407struct KeySetSizeComp {
     408  bool operator() (const KeySet &a, const KeySet &b) { return a.size()<b.size(); }
     409} keyset_comparator;
     410
     411#include <boost/fusion/sequence.hpp>
     412#include <boost/mpl/for_each.hpp>
     413
     414#include "Fragmentation/Summation/AllLevelOrthogonalSummator.hpp"
     415#include "Fragmentation/Summation/IndexSet.hpp"
     416#include "Fragmentation/Summation/IndexSetContainer.hpp"
     417#include "Fragmentation/Summation/SubsetMap.hpp"
     418#include "Fragmentation/Summation/Containers/PartialChargesFused.hpp"
     419#include "Fragmentation/Summation/Containers/PartialChargesMap.hpp"
     420#include "Fragmentation/Summation/SetValues/IndexedPartialCharges.hpp"
     421
    402422ActionState::ptr PotentialFitPartialChargesAction::performCall()
    403423{
     
    409429    return Action::failure;
    410430  }
     431  LOG(3, "There are  " << selected_atoms.size() << " selected atoms.");
    411432
    412433  /// obtain possible fragments to each selected atom
     
    442463  /// obtain average charge for each atom the fitted charges over all its fragments
    443464  detail::fitted_charges_t fitted_charges;
    444   for (std::vector<const atom *>::const_iterator atomiter = selected_atoms.begin();
    445       atomiter != selected_atoms.end(); ++atomiter) {
    446     const atomId_t walkerid = (*atomiter)->getId();
    447     const double average_charge = fitAverageChargeToAtom(
    448         *atomiter, atomfragments, keyset_graphs, fittedcharges_per_fragment);
    449 
    450     if (average_charge != 0.) {
    451       LOG(2, "DEBUG: For atom " << **atomiter << " we have an average charge of "
    452           << average_charge);
    453 
    454       fitted_charges.insert( std::make_pair(walkerid, average_charge) );
    455     }
     465//  for (std::vector<const atom *>::const_iterator atomiter = selected_atoms.begin();
     466//      atomiter != selected_atoms.end(); ++atomiter) {
     467//    const atomId_t walkerid = (*atomiter)->getId();
     468//    const double average_charge = fitAverageChargeToAtom(
     469//        *atomiter, atomfragments, keyset_graphs, fittedcharges_per_fragment);
     470//
     471//    if (average_charge != 0.) {
     472//      LOG(2, "DEBUG: For atom " << **atomiter << " we have an average charge of "
     473//          << average_charge);
     474//
     475//      fitted_charges.insert( std::make_pair(walkerid, average_charge) );
     476//    }
     477//  }
     478  {
     479    // TODO:: convert the data into boost::fusion::map format
     480    std::map<JobId_t, PartialChargesMap_t> PartialCharges_fused;
     481    std::vector<IndexSet> indexsets;
     482    {
     483      JobId_t counter = 0;
     484      for (std::set<KeySet>::const_iterator iter = fragments.begin();
     485          iter != fragments.end(); ++iter) {
     486        const KeySet &currentset = *iter;
     487        // place as IndexSet into container
     488        {
     489          IndexSet tempset;
     490          tempset.insert(currentset.begin(), currentset.end());
     491          indexsets.push_back(tempset);
     492        }
     493        const detail::KeysetsToGraph_t::const_iterator graphiter = keyset_graphs.find(currentset);
     494        if (graphiter == keyset_graphs.end()) {
     495          ELOG(1, "Could not find graph to keyset " << currentset);
     496          return Action::failure;
     497        }
     498        const HomologyGraph &currentgraph = graphiter->second;
     499        const detail::GraphFittedChargeMap_t::const_iterator fragmentiter =
     500            fittedcharges_per_fragment.find(currentgraph);
     501        if (fragmentiter == fittedcharges_per_fragment.end()) {
     502          ELOG(1, "Could not find fragment to graph " << currentgraph);
     503          return Action::failure;
     504        }
     505        const PartialNucleiChargeFitter::charges_t &charges = fragmentiter->second;
     506        PartialChargesMap_t chargemap;
     507        const AtomFragmentsMap::indices_t &full_currentset = atomfragments.getFullKeyset(currentset);
     508        IndexedPartialCharges::indices_t indices(full_currentset.begin(), full_currentset.end());
     509        IndexedPartialCharges::values_t values(charges.begin(), charges.end());
     510        LOG(3, "Inserting " << indices << " with charges " << charges << " into chargemap instance.");
     511        boost::fusion::at_key<PartialChargesFused::partial_charges_t>(chargemap) =
     512            IndexedPartialCharges(indices, values);
     513        PartialCharges_fused.insert( std::make_pair(counter++, chargemap) );
     514      }
     515    }
     516    ASSERT( indexsets.size() == fragments.size(),
     517        "PotentialFitPartialChargesAction::performCall() - not all fragments' keysets were created?");
     518
     519    // prepare index set hierarchy
     520    std::map< JobId_t, size_t > IdentityLookup;
     521    size_t MaxLevel = std::max_element(fragments.begin(), fragments.end(), keyset_comparator)->size();
     522    LOG(3, "The maximum level is " << MaxLevel);
     523    size_t max_indices = fragments.size();
     524    LOG(3, "There are  " << max_indices << " for the selected atoms.");
     525    {
     526      for (size_t index = 0; index < max_indices; ++index)
     527        IdentityLookup.insert( std::make_pair( (JobId_t)index, index ) );
     528    }
     529    IndexSetContainer::ptr container(new IndexSetContainer(indexsets));
     530    SubsetMap::ptr subsetmap(new SubsetMap(*container));
     531
     532    // and sum up
     533    PartialChargesMap_t ZeroInstances;
     534    ZeroInstanceInitializer<PartialChargesMap_t> initZeroInstance(ZeroInstances);
     535    boost::mpl::for_each<PartialChargesVector_t>(boost::ref(initZeroInstance));
     536    //!> results per level of summed up partial charges
     537    std::vector<PartialChargesMap_t> Result_PartialCharges_fused(MaxLevel);
     538    //!> results per index set in terms of value and contribution
     539    std::map<
     540        IndexSet::ptr,
     541        std::pair<PartialChargesMap_t, PartialChargesMap_t> > Result_perIndexSet_PartialCharges;
     542    AllLevelOrthogonalSummator<PartialChargesMap_t> partialchargeSummer(
     543                subsetmap,
     544                PartialCharges_fused,
     545                container->getContainer(),
     546                IdentityLookup,
     547                Result_PartialCharges_fused,
     548                Result_perIndexSet_PartialCharges,
     549                ZeroInstances);
     550    boost::mpl::for_each<PartialChargesVector_t>(boost::ref(partialchargeSummer));
     551
     552    // TODO: place results into fitted_charges
     553    const IndexedPartialCharges::indexedvalues_t indexed_partial_charges =
     554        boost::fusion::at_key<PartialChargesFused::partial_charges_t>(
     555            Result_PartialCharges_fused.back()
     556            ).getValues();
     557    for (IndexedPartialCharges::indexedvalues_t::const_iterator iter = indexed_partial_charges.begin();
     558        iter != indexed_partial_charges.end(); ++iter)
     559    fitted_charges.insert( std::make_pair( iter->first, iter->second.charge));
     560    LOG(3, "Summation has brought forth the following charges per atom index: " << fitted_charges);
    456561  }
    457562
Note: See TracChangeset for help on using the changeset viewer.