- Timestamp:
- Apr 15, 2013, 6:13:22 PM (12 years ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/FragmentationAction/FragmentationAutomationAction.cpp
rfbf143 ra3427f 39 39 #include "CodePatterns/MemDebug.hpp" 40 40 41 // include headers that implement a archive in simple text format42 #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> 50 50 51 51 #include "CodePatterns/Assert.hpp" … … 56 56 #include "Fragmentation/Automation/FragmentJobQueue.hpp" 57 57 #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 58 65 #include "Fragmentation/Automation/VMGDebugGridFragmentController.hpp" 59 66 #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_VMG82 67 #include "Fragmentation/Summation/Containers/VMGData.hpp" 83 68 #include "Fragmentation/Summation/Containers/VMGDataFused.hpp" 84 69 #include "Fragmentation/Summation/Containers/VMGDataMap.hpp" 85 70 #include "Fragmentation/Summation/Containers/VMGData_printKeyNames.hpp" 86 #include "Jobs/VMGDebugGridJob.hpp"87 #include "Jobs/VMGJob.hpp"88 71 #endif 89 72 #include "World.hpp" … … 113 96 } 114 97 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 container125 */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>::type132 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 table160 {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>::type165 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 container180 */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 &longrangeresults213 )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 HomologyContainer232 HomologyContainer::container_t values;233 const size_t FragmentCounter = shortrangeresults.Result_perIndexSet_Energy.size();234 235 // convert KeySetContainer to IndexSetContainer236 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 fragments242 for (;iter != Indices.end(); ++iter, ++forceiter) // go through each IndexSet243 {244 /// create new graph entry in HomologyContainer which is (key,value) type245 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 key252 std::map<IndexSet::ptr, std::pair< MPQCDataFragmentMap_t, MPQCDataFragmentMap_t> >::const_iterator fragmentiter253 = 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 value260 std::map<IndexSet::ptr, std::pair< MPQCDataEnergyMap_t, MPQCDataEnergyMap_t> >::const_iterator energyiter261 = 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); // values266 value.second = boost::fusion::at_key<MPQCDataFused::energy_total>(energyiter->second.second); // contributions267 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 container279 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 again287 std::ofstream outputstream(homology_file.string().c_str());288 if (outputstream.good()) { // check if opened289 boost::archive::text_oarchive oa(outputstream);290 oa << homology_container;291 if (outputstream.fail()) { // check if correctly written292 LOG(1, "Failed to write to file " << homology_file.string() << ".");293 return false;294 } else295 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 304 98 Action::state_ptr FragmentationFragmentationAutomationAction::performCall() { 305 99 boost::asio::io_service io_service; … … 307 101 // TODO: Have io_service run in second thread and merge with current again eventually 308 102 103 FragmentationResultContainer &container = 104 FragmentationResultContainer::getInstance(); 105 const KeySetsContainer& keysets = FragmentJobQueue::getInstance().getKeySets(); 106 const KeySetsContainer& forcekeysets = FragmentJobQueue::getInstance().getFullKeySets(); 107 309 108 size_t Exitflag = 0; 310 std::map<JobId_t, MPQCData> fragmentData;109 std::map<JobId_t, MPQCData> shortrangedata; 311 110 { 312 111 const size_t NumberJobs = FragmentJobQueue::getInstance().size(); … … 325 124 // Phase Three: calculate result 326 125 mpqccontroller.waitforResults(NumberJobs); 327 mpqccontroller.getResults( fragmentData);126 mpqccontroller.getResults(shortrangedata); 328 127 329 128 Exitflag += mpqccontroller.getExitflag(); 330 129 } 331 332 FragmentationShortRangeResults shortrangeresults(333 fragmentData,334 FragmentJobQueue::getInstance().getKeySets(),335 FragmentJobQueue::getInstance().getFullKeySets());336 shortrangeresults(fragmentData);337 printReceivedShortResults(shortrangeresults);338 130 339 131 #ifdef HAVE_VMG … … 346 138 // obtain combined charge density 347 139 FragmentationChargeDensity summedChargeDensity( 348 fragmentData,140 shortrangedata, 349 141 FragmentJobQueue::getInstance().getKeySets()); 350 142 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 " 352 144 << full_sample.size() << " level-wise long-range jobs."); 353 145 354 146 // Phase Four: obtain more ids 355 std::map<JobId_t, VMGData> longrange Data;147 std::map<JobId_t, VMGData> longrangedata; 356 148 { 357 149 VMGFragmentController vmgcontroller(io_service); 358 150 vmgcontroller.setHost(params.host.get()); 359 151 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(); 361 153 vmgcontroller.requestIds(NoJobs); 362 154 … … 365 157 const size_t interpolation_degree = params.interpolation_degree.get(); 366 158 if (!vmgcontroller.createLongRangeJobs( 367 fragmentData,159 shortrangedata, 368 160 full_sample, 369 161 summedChargeDensity.getFragment(), … … 374 166 // Phase Six: calculate result 375 167 vmgcontroller.waitforResults(NoJobs); 376 vmgcontroller.getResults(longrange Data);377 ASSERT( NoJobs == longrange Data.size(),168 vmgcontroller.getResults(longrangedata); 169 ASSERT( NoJobs == longrangedata.size(), 378 170 "FragmentationFragmentationAutomationAction::performCall() - number of MPQCresults+" 379 171 +toString(full_sample.size())+"="+toString(NoJobs) 380 +" and VMGresults "+toString(longrange Data.size())+" don't match.");172 +" and VMGresults "+toString(longrangedata.size())+" don't match."); 381 173 Exitflag += vmgcontroller.getExitflag(); 382 }383 384 // remove full solution corresponding to full_sample from map (must be highest ids), has to be treated extra385 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 result395 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 file408 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 }415 174 } 416 175 … … 430 189 } 431 190 } 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); 433 197 #endif 434 198
Note:
See TracChangeset
for help on using the changeset viewer.