Changeset f68c68 for src/LevMartester.cpp
- Timestamp:
- Feb 24, 2013, 12:58:52 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:
- 68172a
- Parents:
- 8aa597
- git-author:
- Frederik Heber <heber@…> (10/15/12 07:43:23)
- git-committer:
- Frederik Heber <heber@…> (02/24/13 12:58:52)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/LevMartester.cpp
r8aa597 rf68c68 239 239 */ 240 240 void operator()(const range_t &range) { 241 double EnergySum = 0.; //std::numeric_limits<double>::max(); 242 size_t counter = 0.; 243 for (HomologyContainer::const_iterator iter = range.first; iter != range.second; ++iter) { 244 const double &energy = iter->second.second; 245 // if (energy <= EnergySum) 246 // EnergySum = energy; 247 EnergySum += energy; 248 ++counter; 249 } 250 EnergySum *= 1./(double)counter; 241 251 for (HomologyContainer::const_iterator iter = range.first; iter != range.second; ++iter) { 242 252 // get distance out of Fragment … … 248 258 DistanceVector.push_back( args ); 249 259 const double &energy = iter->second.second; 250 EnergyVector.push_back( FunctionModel::results_t(1, energy ) );260 EnergyVector.push_back( FunctionModel::results_t(1, energy-EnergySum) ); 251 261 } 252 262 } … … 266 276 const OutputVector_t& getTrainingOutputs() const { 267 277 return EnergyVector; 278 } 279 280 /** Calculate the L2 error of a given \a model against the stored training data. 281 * 282 * \param model model whose L2 error to calculate 283 * \return sum of squared differences at training tuples 284 */ 285 const double getL2Error(const FunctionModel &model) const 286 { 287 double L2sum = 0.; 288 289 FunctionApproximation::inputs_t::const_iterator initer = DistanceVector.begin(); 290 FunctionApproximation::outputs_t::const_iterator outiter = EnergyVector.begin(); 291 for (; initer != DistanceVector.end(); ++initer, ++outiter) { 292 const FunctionModel::results_t result = model((*initer)); 293 const double temp = fabs((*outiter)[0] - result[0]); 294 L2sum += temp*temp; 295 } 296 return L2sum; 297 } 298 299 /** Calculate the Lmax error of a given \a model against the stored training data. 300 * 301 * \param model model whose Lmax error to calculate 302 * \return maximum difference over all training tuples 303 */ 304 const double getLMaxError(const FunctionModel &model) const 305 { 306 double Lmax = 0.; 307 size_t maxindex = -1; 308 FunctionApproximation::inputs_t::const_iterator initer = DistanceVector.begin(); 309 FunctionApproximation::outputs_t::const_iterator outiter = EnergyVector.begin(); 310 for (; initer != DistanceVector.end(); ++initer, ++outiter) { 311 const FunctionModel::results_t result = model((*initer)); 312 const double temp = fabs((*outiter)[0] - result[0]); 313 if (temp > Lmax) { 314 Lmax = temp; 315 maxindex = std::distance( 316 const_cast<const FunctionApproximation::inputs_t &>(DistanceVector).begin(), 317 initer 318 ); 319 } 320 } 321 return Lmax; 268 322 } 269 323 … … 499 553 500 554 // Afterwards we go through all of this type and gather the distance and the energy value 501 typedef std::pair< 502 FunctionApproximation::inputs_t, 503 FunctionApproximation::outputs_t> InputOutputVector_t; 504 InputOutputVector_t DistanceEnergyVector; 505 std::pair<HomologyContainer::const_iterator, HomologyContainer::const_iterator> range = 506 homologies.getHomologousGraphs(graph); 507 double EnergySum = 0.; //std::numeric_limits<double>::max(); 508 size_t counter = 0.; 509 for (HomologyContainer::const_iterator iter = range.first; iter != range.second; ++iter) { 510 const double &energy = iter->second.second; 511 // if (energy <= EnergySum) 512 // EnergySum = energy; 513 EnergySum += energy; 514 ++counter; 515 } 516 EnergySum *= 1./(double)counter; 517 for (HomologyContainer::const_iterator iter = range.first; iter != range.second; ++iter) { 518 // get distance out of Fragment 519 const double &energy = iter->second.second; 520 const Fragment &fragment = iter->second.first; 521 const Fragment::charges_t charges = fragment.getCharges(); 522 const Fragment::positions_t positions = fragment.getPositions(); 523 FunctionModel::arguments_t args = 524 Extractors::_detail::gatherAllDistanceArguments(positions, DistanceEnergyVector.first.size()); 525 DistanceEnergyVector.first.push_back( args ); 526 DistanceEnergyVector.second.push_back( FunctionModel::results_t(1,energy-EnergySum) ); 527 } 528 // print training data for debugging 529 { 530 LOG(1, "INFO: I gathered the following (" << DistanceEnergyVector.first.size() 531 << "," << DistanceEnergyVector.second.size() << ") data pairs: "); 532 FunctionApproximation::inputs_t::const_iterator initer = DistanceEnergyVector.first.begin(); 533 FunctionApproximation::outputs_t::const_iterator outiter = DistanceEnergyVector.second.begin(); 534 for (; initer != DistanceEnergyVector.first.end(); ++initer, ++outiter) { 535 std::stringstream stream; 536 for (size_t index = 0; index < (*initer).size(); ++index) 537 stream << "(" << (*initer)[index].indices.first << "," << (*initer)[index].indices.second 538 << ") " << (*initer)[index].distance; 539 stream << " with energy " << *outiter; 540 LOG(1, "INFO: " << stream.str()); 541 } 542 } 555 TrainingData TersoffData( 556 TrainingData::extractor_t(&Extractors::gatherAllDistances) // gather first carbon pair 557 ); 558 TersoffData( homologies.getHomologousGraphs(graph) ); 559 LOG(1, "INFO: I gathered the following training data: " << TersoffData); 543 560 // NOTICE that distance are in bohrradi as they come from MPQC! 544 561 545 562 // now perform the function approximation by optimizing the model function 546 563 boost::function< std::vector<FunctionModel::arguments_t>(const argument_t &, const double)> triplefunction = 547 boost::bind(&getTripleFromArgument, DistanceEnergyVector.first, _1, _2);564 boost::bind(&getTripleFromArgument, boost::cref(TersoffData.getTrainingInputs()), _1, _2); 548 565 srand((unsigned)time(0)); // seed with current time 549 566 LOG(0, "INFO: Initial parameters are " << params << "."); … … 553 570 FunctionModel &model = saturation; 554 571 FunctionApproximation approximator( 555 DistanceEnergyVector.first.begin()->size(),556 DistanceEnergyVector.second.begin()->size(),572 TersoffData.getTrainingInputs().begin()->size(), 573 TersoffData.getTrainingOutputs().begin()->size(), 557 574 model); 558 approximator.setTrainingData( DistanceEnergyVector.first,DistanceEnergyVector.second);575 approximator.setTrainingData(TersoffData.getTrainingInputs(),TersoffData.getTrainingOutputs()); 559 576 if (model.isBoxConstraint() && approximator.checkParameterDerivatives()) 560 577 approximator(FunctionApproximation::ParameterDerivative); … … 583 600 584 601 // check L2 and Lmax error against training set 585 double L2sum = 0.; 586 double Lmax = 0.; 587 size_t maxindex = -1; 588 FunctionApproximation::inputs_t::const_iterator initer = DistanceEnergyVector.first.begin(); 589 FunctionApproximation::outputs_t::const_iterator outiter = DistanceEnergyVector.second.begin(); 590 for (; initer != DistanceEnergyVector.first.end(); ++initer, ++outiter) { 591 const FunctionModel::results_t result = model((*initer)); 592 const double temp = fabs((*outiter)[0] - result[0]); 593 LOG(2, "DEBUG: L2 contribution = " << (*outiter)[0] << "-" << result[0] << "=" << temp); 594 if (temp > Lmax) { 595 Lmax = temp; 596 maxindex = std::distance(const_cast<const FunctionApproximation::inputs_t &>(DistanceEnergyVector.first).begin(), initer); 597 } 598 L2sum += temp*temp; 599 } 600 LOG(1, "INFO: L2sum = " << L2sum << ", LMax = " << Lmax << " from " << maxindex); 602 LOG(1, "INFO: L2sum = " << TersoffData.getL2Error(model) 603 << ", LMax = " << TersoffData.getLMaxError(model) << "."); 601 604 } 602 605
Note:
See TracChangeset
for help on using the changeset viewer.