Ignore:
Timestamp:
Apr 15, 2013, 6:13:22 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:
55e1bc
Parents:
fbf143
git-author:
Frederik Heber <heber@…> (04/05/13 15:37:10)
git-committer:
Frederik Heber <heber@…> (04/15/13 18:13:22)
Message:

Split FragmentationAutomationAction into calculation and analysis.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/FragmentationAction/FragmentationAutomationAction.cpp

    rfbf143 ra3427f  
    3939#include "CodePatterns/MemDebug.hpp"
    4040
    41 // include headers that implement a archive in simple text format
    42 #include <boost/archive/text_oarchive.hpp>
    43 #include <boost/archive/text_iarchive.hpp>
    44 
    45 
    46 #include <boost/mpl/remove.hpp>
    47 #include <boost/lambda/lambda.hpp>
    48 
    49 #include <iostream>
     41//// include headers that implement a archive in simple text format
     42//#include <boost/archive/text_oarchive.hpp>
     43//#include <boost/archive/text_iarchive.hpp>
     44
     45//
     46//#include <boost/mpl/remove.hpp>
     47//#include <boost/lambda/lambda.hpp>
     48
     49//#include <iostream>
    5050
    5151#include "CodePatterns/Assert.hpp"
     
    5656#include "Fragmentation/Automation/FragmentJobQueue.hpp"
    5757#include "Fragmentation/Automation/MPQCFragmentController.hpp"
     58#include "Fragmentation/Summation/Containers/FragmentationChargeDensity.hpp"
     59#include "Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp"
     60#include "Fragmentation/Summation/Containers/FragmentationResultContainer.hpp"
     61#include "Fragmentation/Summation/Containers/FragmentationShortRangeResults.hpp"
     62#include "Fragmentation/Summation/Containers/MPQCData.hpp"
     63#include "Fragmentation/KeySetsContainer.hpp"
     64#ifdef HAVE_VMG
    5865#include "Fragmentation/Automation/VMGDebugGridFragmentController.hpp"
    5966#include "Fragmentation/Automation/VMGFragmentController.hpp"
    60 #include "Fragmentation/EnergyMatrix.hpp"
    61 #include "Fragmentation/ForceMatrix.hpp"
    62 #include "Fragmentation/Fragmentation.hpp"
    63 #include "Fragmentation/Homology/HomologyContainer.hpp"
    64 #include "Fragmentation/Homology/HomologyGraph.hpp"
    65 #include "Fragmentation/KeySet.hpp"
    66 #include "Fragmentation/KeySetsContainer.hpp"
    67 #include "Fragmentation/Summation/IndexSetContainer.hpp"
    68 #include "Fragmentation/Summation/writeTable.hpp"
    69 #include "Fragmentation/Summation/Containers/createMatrixNrLookup.hpp"
    70 #include "Fragmentation/Summation/Containers/extractJobIds.hpp"
    71 #include "Fragmentation/Summation/Containers/FragmentationChargeDensity.hpp"
    72 #include "Fragmentation/Summation/Containers/FragmentationLongRangeResults.hpp"
    73 #include "Fragmentation/Summation/Containers/FragmentationShortRangeResults.hpp"
    74 #include "Fragmentation/Summation/Containers/MPQCData.hpp"
    75 #include "Fragmentation/Summation/Containers/MPQCData_printKeyNames.hpp"
    76 #include "Fragmentation/Summation/SetValues/Fragment.hpp"
    77 #include "Fragmentation/Summation/SetValues/Histogram.hpp"
    78 #include "Fragmentation/Summation/SetValues/IndexedVectors.hpp"
    79 #include "Graph/DepthFirstSearchAnalysis.hpp"
    80 #include "Jobs/MPQCJob.hpp"
    81 #ifdef HAVE_VMG
    8267#include "Fragmentation/Summation/Containers/VMGData.hpp"
    8368#include "Fragmentation/Summation/Containers/VMGDataFused.hpp"
    8469#include "Fragmentation/Summation/Containers/VMGDataMap.hpp"
    8570#include "Fragmentation/Summation/Containers/VMGData_printKeyNames.hpp"
    86 #include "Jobs/VMGDebugGridJob.hpp"
    87 #include "Jobs/VMGJob.hpp"
    8871#endif
    8972#include "World.hpp"
     
    11396}
    11497
    115 void writeToFile(const std::string &filename, const std::string contents)
    116 {
    117   std::ofstream tablefile(filename.c_str());
    118   tablefile << contents;
    119   tablefile.close();
    120 }
    121 
    122 /** Print (short range) energy, forces, and timings from received results.
    123  *
    124  * @param results summed up results container
    125  */
    126 void printReceivedShortResults(
    127     const FragmentationShortRangeResults &results)
    128 {
    129   // print tables (without eigenvalues, they go extra)
    130   {
    131     typedef boost::mpl::remove<MPQCDataEnergyVector_t, MPQCDataFused::energy_eigenvalues>::type
    132       MPQCDataEnergyVector_noeigenvalues_t;
    133     const std::string energyresult =
    134         writeTable<MPQCDataEnergyMap_t, MPQCDataEnergyVector_noeigenvalues_t >()(
    135             results.Result_Energy_fused, results.getMaxLevel());
    136     LOG(0, "Energy table is \n" << energyresult);
    137     std::string filename;
    138     filename += FRAGMENTPREFIX + std::string("_Energy.dat");
    139     writeToFile(filename, energyresult);
    140   }
    141 
    142   {
    143     const std::string eigenvalueresult;
    144     LOG(0, "Eigenvalue table is \n" << eigenvalueresult);
    145     std::string filename;
    146     filename += FRAGMENTPREFIX + std::string("_Eigenvalues.dat");
    147     writeToFile(filename, eigenvalueresult);
    148   }
    149 
    150   {
    151     const std::string forceresult =
    152         writeTable<MPQCDataForceMap_t, MPQCDataForceVector_t>()(
    153             results.Result_Force_fused, results.getMaxLevel());
    154     LOG(0, "Force table is \n" << forceresult);
    155     std::string filename;
    156     filename += FRAGMENTPREFIX + std::string("_Forces.dat");
    157     writeToFile(filename, forceresult);
    158   }
    159   // we don't want to print grid to a table
    160   {
    161     // print times (without flops for now)
    162     typedef boost::mpl::remove<
    163         boost::mpl::remove<MPQCDataTimeVector_t, MPQCDataFused::times_total_flops>::type,
    164         MPQCDataFused::times_gather_flops>::type
    165         MPQCDataTimeVector_noflops_t;
    166     const std::string timesresult =
    167         writeTable<MPQCDataTimeMap_t, MPQCDataTimeVector_noflops_t >()(
    168             results.Result_Time_fused, results.getMaxLevel());
    169     LOG(0, "Times table is \n" << timesresult);
    170     std::string filename;
    171     filename += FRAGMENTPREFIX + std::string("_Times.dat");
    172     writeToFile(filename, timesresult);
    173   }
    174 }
    175 
    176 
    177 /** Print long range energy from received results.
    178  *
    179  * @param results summed up results container
    180  */
    181 void printReceivedFullResults(
    182     const FragmentationLongRangeResults &results)
    183 {
    184   // print tables (without eigenvalues, they go extra)
    185 
    186   if (results.Result_LongRange_fused.size() >= (results.getMaxLevel()-2))
    187   {
    188     const std::string gridresult =
    189         writeTable<VMGDataMap_t, VMGDataVector_t >()(
    190             results.Result_LongRange_fused, results.getMaxLevel(), 2);
    191     LOG(0, "VMG table is \n" << gridresult);
    192     std::string filename;
    193     filename += FRAGMENTPREFIX + std::string("_VMGEnergy.dat");
    194     writeToFile(filename, gridresult);
    195   }
    196 
    197   if (results.Result_LongRangeIntegrated_fused.size() >= (results.getMaxLevel()-2))
    198   {
    199     const std::string gridresult =
    200         writeTable<VMGDataLongRangeMap_t, VMGDataLongRangeVector_t >()(
    201             results.Result_LongRangeIntegrated_fused, results.getMaxLevel(), 2);
    202     LOG(0, "LongRange table is \n" << gridresult);
    203     std::string filename;
    204     filename += FRAGMENTPREFIX + std::string("_LongRangeEnergy.dat");
    205     writeToFile(filename, gridresult);
    206   }
    207 }
    208 
    209 bool appendToHomologyFile(
    210     const boost::filesystem::path &homology_file,
    211     const FragmentationShortRangeResults &shortrangeresults,
    212     const FragmentationLongRangeResults &longrangeresults
    213     )
    214 {
    215   /// read homology container (if present)
    216   HomologyContainer homology_container;
    217   if (boost::filesystem::exists(homology_file)) {
    218     std::ifstream returnstream(homology_file.string().c_str());
    219     if (returnstream.good()) {
    220       boost::archive::text_iarchive ia(returnstream);
    221       ia >> homology_container;
    222     } else {
    223       ELOG(2, "Failed to parse from " << homology_file.string() << ".");
    224     }
    225     returnstream.close();
    226   } else {
    227     LOG(2, "Could not open " << homology_file.string()
    228         << ", creating empty container.");
    229   }
    230 
    231   /// append all fragments to a HomologyContainer
    232   HomologyContainer::container_t values;
    233   const size_t FragmentCounter = shortrangeresults.Result_perIndexSet_Energy.size();
    234 
    235   // convert KeySetContainer to IndexSetContainer
    236   IndexSetContainer::ptr ForceContainer(new IndexSetContainer(shortrangeresults.getForceKeySet()));
    237   const IndexSetContainer::Container_t &Indices = shortrangeresults.getContainer();
    238   const IndexSetContainer::Container_t &ForceIndices = ForceContainer->getContainer();
    239   IndexSetContainer::Container_t::const_iterator iter = Indices.begin();
    240   IndexSetContainer::Container_t::const_iterator forceiter = ForceIndices.begin();
    241   /// go through all fragments
    242   for (;iter != Indices.end(); ++iter, ++forceiter) // go through each IndexSet
    243   {
    244     /// create new graph entry in HomologyContainer which is (key,value) type
    245     LOG(1, "INFO: Creating new graph with " << **forceiter << ".");
    246     HomologyGraph graph(**forceiter);
    247     LOG(2, "DEBUG: Created graph " << graph << ".");
    248     const IndexSet::ptr &index = *iter;
    249     HomologyContainer::value_t value;
    250 
    251     // obtain fragment as key
    252     std::map<IndexSet::ptr, std::pair< MPQCDataFragmentMap_t, MPQCDataFragmentMap_t> >::const_iterator fragmentiter
    253         = longrangeresults.Result_perIndexSet_Fragment.find(index);
    254     ASSERT( fragmentiter != longrangeresults.Result_perIndexSet_Fragment.end(),
    255         "appendToHomologyFile() - cannot find index "+toString(*index)
    256         +" in FragmentResults.");
    257     value.first = boost::fusion::at_key<MPQCDataFused::fragment>(fragmentiter->second.first);
    258 
    259     // obtain energy as value
    260     std::map<IndexSet::ptr, std::pair< MPQCDataEnergyMap_t, MPQCDataEnergyMap_t> >::const_iterator energyiter
    261         = shortrangeresults.Result_perIndexSet_Energy.find(index);
    262     ASSERT( energyiter != shortrangeresults.Result_perIndexSet_Energy.end(),
    263         "appendToHomologyFile() - cannot find index "+toString(*index)
    264         +" in FragmentResults.");
    265     // value.second = boost::fusion::at_key<MPQCDataFused::energy_total>(energyiter->second.first); // values
    266     value.second = boost::fusion::at_key<MPQCDataFused::energy_total>(energyiter->second.second); // contributions
    267     values.insert( std::make_pair( graph, value) );
    268   }
    269   homology_container.insert(values);
    270 
    271   LOG(1, "INFO: Listing all present atomic ids ...");
    272   std::stringstream output;
    273   for (World::AtomIterator iter = World::getInstance().getAtomIter();
    274       iter != World::getInstance().atomEnd(); ++iter)
    275     output << (*iter)->getId() << " ";
    276   LOG(1, "INFO: { " << output.str() << "} .");
    277 
    278   // for debugging: print container
    279   LOG(1, "INFO: Listing all present homologies ...");
    280   for (HomologyContainer::container_t::const_iterator iter =
    281       homology_container.begin(); iter != homology_container.end(); ++iter) {
    282     LOG(1, "INFO: graph " << iter->first << " has Fragment "
    283         << iter->second.first << " and associated energy " << iter->second.second << ".");
    284   }
    285 
    286   /// store homology container again
    287   std::ofstream outputstream(homology_file.string().c_str());
    288   if (outputstream.good()) { // check if opened
    289     boost::archive::text_oarchive oa(outputstream);
    290     oa << homology_container;
    291     if (outputstream.fail()) { // check if correctly written
    292       LOG(1, "Failed to write to file " << homology_file.string() << ".");
    293       return false;
    294     } else
    295       outputstream.close();
    296   } else {
    297     LOG(1, "Failed to open file " << homology_file.string()
    298         << " for writing.");
    299     return false;
    300   }
    301   return true;
    302 }
    303 
    30498Action::state_ptr FragmentationFragmentationAutomationAction::performCall() {
    30599  boost::asio::io_service io_service;
     
    307101  // TODO: Have io_service run in second thread and merge with current again eventually
    308102
     103  FragmentationResultContainer &container =
     104      FragmentationResultContainer::getInstance();
     105  const KeySetsContainer& keysets = FragmentJobQueue::getInstance().getKeySets();
     106  const KeySetsContainer& forcekeysets = FragmentJobQueue::getInstance().getFullKeySets();
     107
    309108  size_t Exitflag = 0;
    310   std::map<JobId_t, MPQCData> fragmentData;
     109  std::map<JobId_t, MPQCData> shortrangedata;
    311110  {
    312111    const size_t NumberJobs = FragmentJobQueue::getInstance().size();
     
    325124    // Phase Three: calculate result
    326125    mpqccontroller.waitforResults(NumberJobs);
    327     mpqccontroller.getResults(fragmentData);
     126    mpqccontroller.getResults(shortrangedata);
    328127
    329128    Exitflag += mpqccontroller.getExitflag();
    330129  }
    331 
    332   FragmentationShortRangeResults shortrangeresults(
    333       fragmentData,
    334       FragmentJobQueue::getInstance().getKeySets(),
    335       FragmentJobQueue::getInstance().getFullKeySets());
    336   shortrangeresults(fragmentData);
    337   printReceivedShortResults(shortrangeresults);
    338130
    339131#ifdef HAVE_VMG
     
    346138  // obtain combined charge density
    347139  FragmentationChargeDensity summedChargeDensity(
    348       fragmentData,
     140      shortrangedata,
    349141      FragmentJobQueue::getInstance().getKeySets());
    350142  const std::vector<SamplingGrid> full_sample = summedChargeDensity.getFullSampledGrid();
    351   LOG(1, "INFO: There are " << fragmentData.size() << " short-range and "
     143  LOG(1, "INFO: There are " << shortrangedata.size() << " short-range and "
    352144      << full_sample.size() << " level-wise long-range jobs.");
    353145
    354146  // Phase Four: obtain more ids
    355   std::map<JobId_t, VMGData> longrangeData;
     147  std::map<JobId_t, VMGData> longrangedata;
    356148  {
    357149    VMGFragmentController vmgcontroller(io_service);
    358150    vmgcontroller.setHost(params.host.get());
    359151    vmgcontroller.setPort(params.port.get());
    360     const size_t NoJobs = fragmentData.size()+full_sample.size();
     152    const size_t NoJobs = shortrangedata.size()+full_sample.size();
    361153    vmgcontroller.requestIds(NoJobs);
    362154
     
    365157    const size_t interpolation_degree = params.interpolation_degree.get();
    366158    if (!vmgcontroller.createLongRangeJobs(
    367         fragmentData,
     159        shortrangedata,
    368160        full_sample,
    369161        summedChargeDensity.getFragment(),
     
    374166    // Phase Six: calculate result
    375167    vmgcontroller.waitforResults(NoJobs);
    376     vmgcontroller.getResults(longrangeData);
    377     ASSERT( NoJobs == longrangeData.size(),
     168    vmgcontroller.getResults(longrangedata);
     169    ASSERT( NoJobs == longrangedata.size(),
    378170        "FragmentationFragmentationAutomationAction::performCall() - number of MPQCresults+"
    379171        +toString(full_sample.size())+"="+toString(NoJobs)
    380         +" and VMGresults "+toString(longrangeData.size())+" don't match.");
     172        +" and VMGresults "+toString(longrangedata.size())+" don't match.");
    381173    Exitflag += vmgcontroller.getExitflag();
    382   }
    383 
    384   // remove full solution corresponding to full_sample from map (must be highest ids), has to be treated extra
    385   std::map<JobId_t, VMGData>::iterator iter = longrangeData.end();
    386   for (size_t i=0;i<full_sample.size();++i)
    387     --iter;
    388   std::map<JobId_t, VMGData>::iterator remove_iter = iter;
    389   std::vector<VMGData> fullsolutionData;
    390   for (; iter != longrangeData.end(); ++iter)
    391     fullsolutionData.push_back(iter->second);
    392   longrangeData.erase(remove_iter, longrangeData.end());
    393 
    394   // Final phase: sum up and print result
    395   FragmentationLongRangeResults longrangeresults(
    396       fragmentData,
    397       longrangeData,
    398       FragmentJobQueue::getInstance().getKeySets(),
    399       FragmentJobQueue::getInstance().getFullKeySets());
    400   longrangeresults(
    401       fragmentData,
    402       longrangeData,
    403       fullsolutionData,
    404       full_sample);
    405   printReceivedFullResults(longrangeresults);
    406 
    407   // append all keysets to homology file
    408   if ((Exitflag == 0) && (!params.homology_file.get().empty())) {
    409     const boost::filesystem::path &homology_file = params.homology_file.get();
    410     if (homology_file.string() != "") {
    411       LOG(1, "INFO: Appending HomologyGraphs to file " << homology_file.string() << ".");
    412       if (!appendToHomologyFile(homology_file, shortrangeresults, longrangeresults))
    413         Exitflag = 1;
    414     }
    415174  }
    416175
     
    430189    }
    431190  }
    432   }
     191  container.addFullResults(keysets, forcekeysets, shortrangedata, longrangedata);
     192  } else {
     193    container.addShortRangeResults(keysets, forcekeysets, shortrangedata);
     194  }
     195#else
     196  container.addShortRangeResults(keysets, forcekeysets, shortrangedata);
    433197#endif
    434198
Note: See TracChangeset for help on using the changeset viewer.