Changeset e828c0 for src/unittests
- Timestamp:
- Dec 4, 2010, 11:56:28 PM (14 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:
- 4fbca9c, f03705
- Parents:
- 1fb318
- git-author:
- Frederik Heber <heber@…> (12/04/10 18:10:56)
- git-committer:
- Frederik Heber <heber@…> (12/04/10 23:56:28)
- Location:
- src/unittests
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/unittests/SubspaceFactorizerUnittest.cpp
r1fb318 re828c0 27 27 #include <boost/foreach.hpp> 28 28 #include <boost/shared_ptr.hpp> 29 #include <boost/timer.hpp> 29 30 30 31 #include "Helpers/Assert.hpp" … … 49 50 matrix = new MatrixContent(matrixdimension,matrixdimension); 50 51 matrix->setZero(); 51 for (int i=0; i<matrixdimension ; i++) { 52 matrix->set(i,i, 2.); 53 if (i < (matrixdimension-1)) { 54 matrix->set(i+1,i, 1.); 55 matrix->set(i,i+1, 1.); 52 for (size_t i=0; i<matrixdimension ; i++) { 53 for (size_t j=0; j<= i; ++j) { 54 //const double value = 10. * rand() / (double)RAND_MAX; 55 //const double value = i==j ? 2. : 1.; 56 if (i==j) 57 matrix->set(i,i, 2.); 58 else if (j+1 == i) { 59 matrix->set(i,j, 1.); 60 matrix->set(j,i, 1.); 61 } else { 62 matrix->set(i,j, 0.); 63 matrix->set(j,i, 0.); 64 } 56 65 } 57 66 } … … 209 218 if (fabs(scp - 1.) > MYEPSILON) { 210 219 nonnormalized++; 211 Log() << Verbose( 1) << "Vector " << firstindex << " is not normalized, off by "220 Log() << Verbose(2) << "Vector " << firstindex << " is not normalized, off by " 212 221 << fabs(1.-(*CurrentEigenvectors[firstindex])*(*CurrentEigenvectors[secondindex])) << std::endl; 213 222 } … … 215 224 if (fabs(scp) > MYEPSILON) { 216 225 nonorthogonal++; 217 Log() << Verbose( 1) << "Scalar product between " << firstindex << " and " << secondindex226 Log() << Verbose(2) << "Scalar product between " << firstindex << " and " << secondindex 218 227 << " is " << (*CurrentEigenvectors[firstindex])*(*CurrentEigenvectors[secondindex]) << std::endl; 219 228 } … … 223 232 224 233 if ((nonnormalized == 0) && (nonorthogonal == 0)) { 225 Log() << Verbose(1) << "All vectors are orthonormal to each other." << std::endl;234 DoLog(1) && (DoLog(1) && (Log() << Verbose(1) << "All vectors are orthonormal to each other." << std::endl)); 226 235 return true; 227 236 } 228 237 if ((nonnormalized == 0) && (nonorthogonal != 0)) 229 Log() << Verbose(1) << "All vectors are normalized." << std::endl;238 DoLog(1) && (DoLog(1) && (Log() << Verbose(1) << "All vectors are normalized." << std::endl)); 230 239 if ((nonnormalized != 0) && (nonorthogonal == 0)) 231 Log() << Verbose(1) << "All vectors are orthogonal to each other." << std::endl;240 DoLog(1) && (DoLog(1) && (Log() << Verbose(1) << "All vectors are orthogonal to each other." << std::endl)); 232 241 return false; 233 242 } … … 289 298 VectorValueList *&ParallelEigenvectorList) 290 299 { 291 Log() << Verbose(1) << "Current Eigenvector is " << *CurrentEigenvector << std::endl;300 DoLog(1) && (DoLog(1) && (Log() << Verbose(1) << "Current Eigenvector is " << *CurrentEigenvector << std::endl)); 292 301 293 302 // (for now settle with the one we are most parallel to) … … 295 304 double mostparallel_scalarproduct = 0.; 296 305 BOOST_FOREACH( size_t indexiter, CorrespondenceList) { 297 Log() << Verbose(2) << "Comparing to old " << indexiter << "th eigenvector " << *(CurrentEigenvectors[indexiter]) << std::endl;306 DoLog(2) && (DoLog(2) && (Log() << Verbose(2) << "Comparing to old " << indexiter << "th eigenvector " << *(CurrentEigenvectors[indexiter]) << std::endl)); 298 307 const double scalarproduct = (*(CurrentEigenvectors[indexiter])) * (*CurrentEigenvector); 299 Log() << Verbose(2) << "SKP is " << scalarproduct << std::endl;308 DoLog(2) && (DoLog(2) && (Log() << Verbose(2) << "SKP is " << scalarproduct << std::endl)); 300 309 if (fabs(scalarproduct) > mostparallel_scalarproduct) { 301 310 mostparallel_scalarproduct = fabs(scalarproduct); … … 308 317 if ((*(CurrentEigenvectors[mostparallel_index])) * (*CurrentEigenvector) < 0) { 309 318 *CurrentEigenvector *= -1.; 310 Log() << Verbose(1) << "Pushing (inverted) " << *CurrentEigenvector << " into parallel list [" << mostparallel_index << "]" << std::endl;319 DoLog(1) && (Log() << Verbose(1) << "Pushing (inverted) " << *CurrentEigenvector << " into parallel list [" << mostparallel_index << "]" << std::endl); 311 320 } else { 312 Log() << Verbose(1) << "Pushing " << *CurrentEigenvector << " into parallel list [" << mostparallel_index << "]" << std::endl;321 DoLog(1) && (Log() << Verbose(1) << "Pushing " << *CurrentEigenvector << " into parallel list [" << mostparallel_index << "]" << std::endl); 313 322 } 314 323 ParallelEigenvectorList[mostparallel_index].push_back(make_pair(boost::shared_ptr<VectorContent>(CurrentEigenvector), eigenvalue)); … … 360 369 for (size_t dim = 0; dim<subspacelimit;++dim) { 361 370 // for every index set of this dimension 362 Log() << Verbose(0) << std::endl << std::endl;363 Log() << Verbose(0) << "Current dimension is " << dim << std::endl;371 DoLog(0) && (Log() << Verbose(0) << std::endl << std::endl); 372 DoLog(0) && (Log() << Verbose(0) << "Current dimension is " << dim << std::endl); 364 373 std::pair<IndexMap::const_iterator,IndexMap::const_iterator> Bounds = Dimension_to_Indexset.equal_range(dim); 365 374 for (IndexMap::const_iterator IndexsetIter = Bounds.first; … … 367 376 ++IndexsetIter) { 368 377 // show the index set 369 Log() << Verbose(0) << std::endl;370 Log() << Verbose(1) << "Current index set is " << *(IndexsetIter->second) << std::endl;378 DoLog(0) && (Log() << Verbose(0) << std::endl); 379 DoLog(1) && (Log() << Verbose(1) << "Current index set is " << *(IndexsetIter->second) << std::endl); 371 380 372 381 // create transformation matrices from these 373 382 MatrixContent *subsystem = getSubspaceMatrix(*matrix, CurrentEigenvectors, *(IndexsetIter->second)); 374 Log() << Verbose(2) << "Subsystem matrix is " << *subsystem << std::endl;383 DoLog(2) && (Log() << Verbose(2) << "Subsystem matrix is " << *subsystem << std::endl); 375 384 376 385 // solve _small_ systems for eigenvalues 377 386 VectorContent *Eigenvalues = new VectorContent(subsystem->transformToEigenbasis()); 378 Log() << Verbose(2) << "Eigenvector matrix is " << *subsystem << std::endl;379 Log() << Verbose(2) << "Eigenvalues are " << *Eigenvalues << std::endl;387 DoLog(2) && (Log() << Verbose(2) << "Eigenvector matrix is " << *subsystem << std::endl); 388 DoLog(2) && (Log() << Verbose(2) << "Eigenvalues are " << *Eigenvalues << std::endl); 380 389 381 390 // blow up eigenvectors to matrixdimensiondim column vector again 382 391 MatrixContent *Eigenvectors = embedSubspaceMatrix(CurrentEigenvectors, *subsystem, *(IndexsetIter->second)); 383 Log() << Verbose(1) << matrixdimension << "x" << matrixdimension << " Eigenvector matrix is " << *Eigenvectors << std::endl;392 DoLog(1) && (Log() << Verbose(1) << matrixdimension << "x" << matrixdimension << " Eigenvector matrix is " << *Eigenvectors << std::endl); 384 393 385 394 // we don't need the subsystem anymore … … 408 417 // print list of similar eigenvectors 409 418 BOOST_FOREACH( size_t index, AllIndices) { 410 Log() << Verbose(2) << "Similar to " << index << "th current eigenvector " << *(CurrentEigenvectors[index]) << " are:" << std::endl;419 DoLog(2) && (Log() << Verbose(2) << "Similar to " << index << "th current eigenvector " << *(CurrentEigenvectors[index]) << " are:" << std::endl); 411 420 BOOST_FOREACH( VectorValueList::value_type &iter, ParallelEigenvectorList[index] ) { 412 Log() << Verbose(2) << *(iter.first) << std::endl;413 } 414 Log() << Verbose(2) << std::endl;421 DoLog(2) && (Log() << Verbose(2) << *(iter.first) << std::endl); 422 } 423 DoLog(2) && (Log() << Verbose(2) << std::endl); 415 424 } 416 425 … … 434 443 // orthonormalize 435 444 if (!dontOrthonormalization) { 436 Log() << Verbose(0) << "Orthonormalizing ... " << std::endl;445 DoLog(0) && (Log() << Verbose(0) << "Orthonormalizing ... " << std::endl); 437 446 for (IndexSet::const_iterator firstindex = AllIndices.begin(); 438 447 firstindex != AllIndices.end(); … … 456 465 457 466 // show new ones 458 Log() << Verbose(0) << "Resulting new eigenvectors and -values, run " << run << " are:" << std::endl;467 DoLog(0) && (Log() << Verbose(0) << "Resulting new eigenvectors and -values, run " << run << " are:" << std::endl); 459 468 BOOST_FOREACH( size_t index, AllIndices) { 460 Log() << Verbose(0) << *CurrentEigenvectors[index] << " with " << CurrentEigenvalues[index] << std::endl;469 DoLog(0) && (Log() << Verbose(0) << *CurrentEigenvectors[index] << " with " << CurrentEigenvalues[index] << std::endl); 461 470 } 462 471 run++; 463 472 } 464 473 465 466 474 delete[] ParallelEigenvectorList; 467 475 468 476 CPPUNIT_ASSERT_EQUAL(0,0); 477 } 478 479 480 /** Iterative function to generate all power sets of indices of size \a maxelements. 481 * 482 * @param SetofSets Container for all sets 483 * @param CurrentSet pointer to current set in this container 484 * @param Indices Source set of indices 485 * @param maxelements number of elements of each set in final SetofSets 486 * @return true - generation continued, false - current set already had 487 * \a maxelements elements 488 */ 489 bool generatePowerSet( 490 SetofIndexSets &SetofSets, 491 SetofIndexSets::iterator &CurrentSet, 492 IndexSet &Indices, 493 const size_t maxelements) 494 { 495 if (CurrentSet->size() < maxelements) { 496 // allocate the needed sets 497 const size_t size = Indices.size() - CurrentSet->size(); 498 std::vector<std::set<size_t> > SetExpanded; 499 SetExpanded.reserve(size); 500 501 // copy the current set into each 502 for (size_t i=0;i<size;++i) 503 SetExpanded.push_back(*CurrentSet); 504 505 // expand each set by one index 506 size_t localindex=0; 507 BOOST_FOREACH(size_t iter, Indices) { 508 if (CurrentSet->count(iter) == 0) { 509 SetExpanded[localindex].insert(iter); 510 ++localindex; 511 } 512 } 513 514 // insert set at position of CurrentSet 515 for (size_t i=0;i<size;++i) { 516 //DoLog(1) && (Log() << Verbose(1) << "Inserting set #" << i << ": " << SetExpanded[i] << std::endl); 517 SetofSets.insert(CurrentSet, SetExpanded[i]); 518 } 519 SetExpanded.clear(); 520 521 // and remove the current set 522 //SetofSets.erase(CurrentSet); 523 //CurrentSet = SetofSets.begin(); 524 525 // set iterator to a valid position again 526 ++CurrentSet; 527 return true; 528 } else { 529 return false; 530 } 531 } 532 533 void SubspaceFactorizerUnittest::generatePowerSetTest() 534 { 535 IndexSet AllIndices; 536 for (size_t i=0;i<4;++i) 537 AllIndices.insert(i); 538 539 SetofIndexSets SetofSets; 540 // note that starting off empty set is unstable 541 IndexSet singleset; 542 BOOST_FOREACH(size_t iter, AllIndices) { 543 singleset.insert(iter); 544 SetofSets.insert(singleset); 545 singleset.clear(); 546 } 547 SetofIndexSets::iterator CurrentSet = SetofSets.begin(); 548 while (CurrentSet != SetofSets.end()) { 549 //DoLog(0) && (Log() << Verbose(0) << "Current set is " << *CurrentSet << std::endl); 550 if (!generatePowerSet(SetofSets, CurrentSet, AllIndices, 2)) { 551 // go to next set 552 ++CurrentSet; 553 } 554 } 555 556 SetofIndexSets ComparisonSet; 557 // now follows a very stupid construction 558 // because we can't use const arrays of some type meaningfully ... 559 { IndexSet tempSet; tempSet.insert(0); ComparisonSet.insert(tempSet); } 560 { IndexSet tempSet; tempSet.insert(1); ComparisonSet.insert(tempSet); } 561 { IndexSet tempSet; tempSet.insert(2); ComparisonSet.insert(tempSet); } 562 { IndexSet tempSet; tempSet.insert(3); ComparisonSet.insert(tempSet); } 563 564 { IndexSet tempSet; tempSet.insert(0); tempSet.insert(1); ComparisonSet.insert(tempSet); } 565 { IndexSet tempSet; tempSet.insert(0); tempSet.insert(2); ComparisonSet.insert(tempSet); } 566 { IndexSet tempSet; tempSet.insert(0); tempSet.insert(3); ComparisonSet.insert(tempSet); } 567 568 { IndexSet tempSet; tempSet.insert(1); tempSet.insert(2); ComparisonSet.insert(tempSet); } 569 { IndexSet tempSet; tempSet.insert(1); tempSet.insert(3); ComparisonSet.insert(tempSet); } 570 571 { IndexSet tempSet; tempSet.insert(2); tempSet.insert(3); ComparisonSet.insert(tempSet); } 572 573 CPPUNIT_ASSERT_EQUAL(SetofSets, ComparisonSet); 574 } 575 576 bool cmd(double a, double b) 577 { 578 return a > b; 469 579 } 470 580 … … 474 584 Eigenspace::eigenvalueset CurrentEigenvalues; 475 585 476 Log() << Verbose(0) << std::endl << std::endl; 586 setVerbosity(0); 587 588 boost::timer Time_generatingfullspace; 589 DoLog(0) && (Log() << Verbose(0) << std::endl << std::endl); 477 590 // create the total index set 478 591 IndexSet AllIndices; … … 480 593 AllIndices.insert(i); 481 594 Eigenspace FullSpace(AllIndices, *matrix); 482 Log() << Verbose(1) << "Generated full space: " << FullSpace << std::endl; 595 DoLog(1) && (Log() << Verbose(1) << "Generated full space: " << FullSpace << std::endl); 596 DoLog(0) && (Log() << Verbose(0) << "Full space generation took " << Time_generatingfullspace.elapsed() << " seconds." << std::endl); 483 597 484 598 // generate first set of eigenvectors … … 492 606 } 493 607 494 Log() << Verbose(1) << "Generating sub spaces ..." << std::endl; 495 // create all consecutive index subsets for dim 1 to 3 608 boost::timer Time_generatingsubsets; 609 DoLog(0) && (Log() << Verbose(0) << "Generating sub sets ..." << std::endl); 610 SetofIndexSets SetofSets; 611 // note that starting off empty set is unstable 612 IndexSet singleset; 613 BOOST_FOREACH(size_t iter, AllIndices) { 614 singleset.insert(iter); 615 SetofSets.insert(singleset); 616 singleset.clear(); 617 } 618 SetofIndexSets::iterator CurrentSet = SetofSets.begin(); 619 while (CurrentSet != SetofSets.end()) { 620 //DoLog(2) && (Log() << Verbose(2) << "Current set is " << *CurrentSet << std::endl); 621 if (!generatePowerSet(SetofSets, CurrentSet, AllIndices, subspacelimit)) { 622 // go to next set 623 ++CurrentSet; 624 } 625 } 626 DoLog(0) && (Log() << Verbose(0) << "Sub set generation took " << Time_generatingsubsets.elapsed() << " seconds." << std::endl); 627 628 // create a subspace to each set and and to respective level 629 boost::timer Time_generatingsubspaces; 630 DoLog(0) && (Log() << Verbose(0) << "Generating sub spaces ..." << std::endl); 496 631 SubspaceMap Dimension_to_Indexset; 497 for (size_t dim = 0; dim<3;++dim) { 498 for (size_t i=0;i<matrixdimension;++i) { 499 IndexSet *indexset = new IndexSet; 500 for (size_t j=0;j<dim+1;++j) { 501 const int value = (i+j) % matrixdimension; 502 //std::cout << "Putting " << value << " into " << i << "th map " << dim << std::endl; 503 CPPUNIT_ASSERT_MESSAGE("index "+toString(value)+" already present in "+toString(dim)+"-dim "+toString(i)+"th indexset.", indexset->count(value) == 0); 504 indexset->insert(value); 505 } 506 boost::shared_ptr<Subspace> subspace(new Subspace(*indexset, FullSpace)); 507 Log() << Verbose(1) << "Current subspace is " << *subspace << std::endl; 508 Dimension_to_Indexset.insert( make_pair(dim, boost::shared_ptr<Subspace>(subspace)) ); 509 delete(indexset); 510 511 // for through next lower subspace list and add to subspaces if contained. 512 if (dim != 0) { 513 Log() << Verbose(1) << "Going through subspace list in dim " << dim-1 << "." << std::endl; 632 BOOST_FOREACH(std::set<size_t> iter, SetofSets) { 633 boost::shared_ptr<Subspace> subspace(new Subspace(iter, FullSpace)); 634 DoLog(1) && (Log() << Verbose(1) << "Current subspace is " << *subspace << std::endl); 635 Dimension_to_Indexset.insert( make_pair(iter.size(), boost::shared_ptr<Subspace>(subspace)) ); 636 } 637 638 for (size_t dim = 1; dim<=subspacelimit;++dim) { 639 BOOST_FOREACH( SubspaceMap::value_type subspace, Dimension_to_Indexset.equal_range(dim)) { 640 if (dim != 0) { // from level 1 and onward 514 641 BOOST_FOREACH( SubspaceMap::value_type entry, Dimension_to_Indexset.equal_range(dim-1)) { 515 if (subspace->contains(*entry.second)) { 516 Log() << Verbose(2) << "Adding " << *(entry.second) << " to list of contained subspaces." << std::endl; 517 subspace->addSubset(entry.second); 642 if (subspace.second->contains(*entry.second)) { 643 // if contained then add ... 644 subspace.second->addSubset(entry.second); 645 // ... and also its containees as they are all automatically contained as well 646 BOOST_FOREACH(boost::shared_ptr<Subspace> iter, entry.second->SubIndices) { 647 subspace.second->addSubset(iter); 648 } 518 649 } 519 650 } 520 } else { 521 Log() << Verbose(2) << "Subspace with dimension of 1 cannot contain other subspaces." << std::endl; 522 } 523 524 } 525 } 526 651 } 652 } 653 } 654 DoLog(0) && (Log() << Verbose(0) << "Sub space generation took " << Time_generatingsubspaces.elapsed() << " seconds." << std::endl); 655 656 // create a file handle for the eigenvalues 657 std::ofstream outputvalues("eigenvalues.dat", std::ios_base::trunc); 658 ASSERT(outputvalues.good(), 659 "SubspaceFactorizerUnittest::EigenvectorTest() - failed to open eigenvalue file!"); 660 outputvalues << "# iteration "; 661 BOOST_FOREACH(size_t iter, AllIndices) { 662 outputvalues << "\teigenvalue" << iter; 663 } 664 outputvalues << std::endl; 665 666 DoLog(0) && (Log() << Verbose(0) << "Solving ..." << std::endl); 667 boost::timer Time_solving; 527 668 size_t run=1; // counting iterations 528 669 double threshold = 1.; // containing threshold value 529 while ((threshold > 1e-10) && (run < 10)) {670 while ((threshold > MYEPSILON) && (run < 20)) { 530 671 // for every dimension 531 for (size_t dim = 0; dim<subspacelimit;++dim) {672 for (size_t dim = 1; dim <= subspacelimit;++dim) { 532 673 // for every index set of this dimension 533 Log() << Verbose(0) << std::endl << std::endl;534 Log() << Verbose(0) << "Current dimension is " << dim << std::endl;674 DoLog(1) && (Log() << Verbose(1) << std::endl << std::endl); 675 DoLog(1) && (Log() << Verbose(1) << "Current dimension is " << dim << std::endl); 535 676 std::pair<SubspaceMap::const_iterator,SubspaceMap::const_iterator> Bounds = Dimension_to_Indexset.equal_range(dim); 536 677 for (SubspaceMap::const_iterator IndexsetIter = Bounds.first; … … 539 680 Subspace& subspace = *(IndexsetIter->second); 540 681 // show the index set 541 Log() << Verbose(0) << std::endl;542 Log() << Verbose(1) << "Current subspace is " << subspace << std::endl;682 DoLog(2) && (Log() << Verbose(2) << std::endl); 683 DoLog(2) && (Log() << Verbose(2) << "Current subspace is " << subspace << std::endl); 543 684 544 685 // solve … … 550 691 551 692 // print list of similar eigenvectors 693 DoLog(2) && (Log() << Verbose(2) << std::endl); 552 694 BOOST_FOREACH( size_t index, AllIndices) { 553 Log() << Verbose(2) << "Similar to " << index << "th current eigenvector " << *(CurrentEigenvectors[index]) << " are:" << std::endl;695 DoLog(2) && (Log() << Verbose(2) << "Similar to " << index << "th current eigenvector " << *(CurrentEigenvectors[index]) << " are:" << std::endl); 554 696 BOOST_FOREACH( SubspaceMap::value_type iter, Dimension_to_Indexset) { 555 697 const VectorContent & CurrentEV = (iter.second)->getEigenvectorParallelToFullOne(index); 556 698 if (!CurrentEV.IsZero()) 557 Log() << Verbose(2) << CurrentEV << std::endl; 558 } 559 Log() << Verbose(2) << std::endl; 699 Log() << Verbose(2) 700 << "dim" << iter.first 701 << ", subspace{" << (iter.second)->getIndices() 702 << "}: "<<CurrentEV << std::endl; 703 } 704 DoLog(2) && (Log() << Verbose(2) << std::endl); 560 705 } 561 706 … … 567 712 BOOST_FOREACH( SubspaceMap::value_type iter, Dimension_to_Indexset) { 568 713 const VectorContent CurrentEV = (iter.second)->getEigenvectorParallelToFullOne(index); 569 *CurrentEigenvectors[index] += CurrentEV * (iter.second)->getEigenvalueOfEigenvectorParallelToFullOne(index);714 *CurrentEigenvectors[index] += CurrentEV; // * (iter.second)->getEigenvalueOfEigenvectorParallelToFullOne(index); 570 715 CurrentEigenvalues[index] += (iter.second)->getEigenvalueOfEigenvectorParallelToFullOne(index); 571 716 if (!CurrentEV.IsZero()) … … 573 718 } 574 719 *CurrentEigenvectors[index] *= 1./CurrentEigenvalues[index]; 575 CurrentEigenvalues[index] /= (double)count;720 //CurrentEigenvalues[index] /= (double)count; 576 721 } 577 722 … … 582 727 // orthonormalize 583 728 if (!dontOrthonormalization) { 584 Log() << Verbose(0) << "Orthonormalizing ... " << std::endl;729 DoLog(1) && (Log() << Verbose(1) << "Orthonormalizing ... " << std::endl); 585 730 for (IndexSet::const_iterator firstindex = AllIndices.begin(); 586 731 firstindex != AllIndices.end(); … … 607 752 608 753 // show new ones 609 Log() << Verbose(0) << "Resulting new eigenvectors and -values, run " << run << " are:" << std::endl; 754 DoLog(1) && (Log() << Verbose(1) << "Resulting new eigenvectors and -values, run " << run << " are:" << std::endl); 755 outputvalues << run; 610 756 BOOST_FOREACH( size_t index, AllIndices) { 611 Log() << Verbose(0) << *CurrentEigenvectors[index] << " with " << CurrentEigenvalues[index] << std::endl; 612 } 757 DoLog(1) && (Log() << Verbose(1) << *CurrentEigenvectors[index] << " with " << CurrentEigenvalues[index] << std::endl); 758 outputvalues << "\t" << CurrentEigenvalues[index]; 759 } 760 outputvalues << std::endl; 761 762 // and next iteration 763 DoLog(0) && (Log() << Verbose(0) << "\titeration #" << run << std::endl); 613 764 run++; 614 765 } 615 766 DoLog(0) && (Log() << Verbose(0) << "Solving took " << Time_solving.elapsed() << " seconds." << std::endl); 767 // show final ones 768 DoLog(0) && (Log() << Verbose(0) << "Resulting new eigenvectors and -values, run " << run << " are:" << std::endl); 769 outputvalues << run; 770 BOOST_FOREACH( size_t index, AllIndices) { 771 DoLog(0) && (Log() << Verbose(0) << *CurrentEigenvectors[index] << " with " << CurrentEigenvalues[index] << std::endl); 772 outputvalues << "\t" << CurrentEigenvalues[index]; 773 } 774 outputvalues << std::endl; 775 outputvalues.close(); 776 777 setVerbosity(2); 778 779 DoLog(0) && (Log() << Verbose(0) << "Solving full space ..." << std::endl); 780 boost::timer Time_comparison; 781 MatrixContent tempFullspaceMatrix = FullSpace.getEigenspaceMatrix(); 782 gsl_vector *eigenvalues = tempFullspaceMatrix.transformToEigenbasis(); 783 tempFullspaceMatrix.sortEigenbasis(eigenvalues); 784 DoLog(0) && (Log() << Verbose(0) << "full space solution took " << Time_comparison.elapsed() << " seconds." << std::endl); 785 786 // compare all 787 sort(CurrentEigenvalues.begin(),CurrentEigenvalues.end()); //, cmd); 788 for (size_t i=0;i<eigenvalues->size; ++i) { 789 CPPUNIT_ASSERT_MESSAGE(toString(i)+"ths eigenvalue differs:" 790 +toString(CurrentEigenvalues[i])+" != "+toString(gsl_vector_get(eigenvalues,i)), 791 fabs((CurrentEigenvalues[i] - gsl_vector_get(eigenvalues,i))/CurrentEigenvalues[i]) < 1e-3); 792 } 616 793 617 794 CPPUNIT_ASSERT_EQUAL(0,0); -
src/unittests/SubspaceFactorizerUnittest.hpp
r1fb318 re828c0 15 15 class Subspace; 16 16 17 typedef std::set<std::set<size_t> > SetofIndexSets; 17 18 typedef std::set<size_t> IndexSet; 18 19 typedef std::multimap< size_t, boost::shared_ptr<Subspace> > SubspaceMap; … … 27 28 CPPUNIT_TEST_SUITE( SubspaceFactorizerUnittest) ; 28 29 CPPUNIT_TEST ( BlockTest ); 29 CPPUNIT_TEST ( EigenvectorTest ); 30 //CPPUNIT_TEST ( EigenvectorTest ); 31 CPPUNIT_TEST ( generatePowerSetTest ); 30 32 CPPUNIT_TEST ( SubspaceTest ); 31 33 CPPUNIT_TEST_SUITE_END(); … … 37 39 void BlockTest(); 38 40 void EigenvectorTest(); 41 void generatePowerSetTest(); 39 42 void SubspaceTest(); 40 43 41 enum { matrixdimension = 3};42 enum { subspacelimit = 2};44 enum { matrixdimension = 4 }; 45 enum { subspacelimit = 3 }; 43 46 private: 44 47
Note:
See TracChangeset
for help on using the changeset viewer.