Ignore:
Timestamp:
Aug 9, 2013, 2:20:35 PM (11 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:
a633f6
Parents:
0f5d38
git-author:
Frederik Heber <heber@…> (06/25/13 12:41:01)
git-committer:
Frederik Heber <heber@…> (08/09/13 14:20:35)
Message:

Added two filter functions to Extractors.

  • renamed reorderArgumentsByParticleTypes()->filterArgumentsByParticleTypes().
  • added reorderArgumentsByParticleTypes() that expects arguments matching to given particle types and which reorders into matching bunches with associated indices.
  • added suitable combination of the two filter as each potential's specific filter.
  • had to add specific comparator for Particle_Types_t to allow flipped types in argument_map.
  • reorderArgumentsByParticleTypes() prints with enhanced toString.
  • FIX: Histogram did not use the pair-wise operator<<(). (this occured because of new operator<<(..,pair) from toString.hpp).
  • we enforce CodePatterns 1.2.7 now.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/FunctionApproximation/Extractors.cpp

    r0f5d38 r51e0e3  
    4545
    4646#include "CodePatterns/Assert.hpp"
     47#include "CodePatterns/IteratorAdaptors.hpp"
    4748#include "CodePatterns/Log.hpp"
     49#include "CodePatterns/toString.hpp"
    4850
    4951#include "LinearAlgebra/Vector.hpp"
     
    538540}
    539541
     542
     543struct ParticleTypesComparator {
     544  bool operator()(const argument_t::types_t &a, const argument_t::types_t &b)
     545  {
     546    if (a.first < a.second) {
     547      if (b.first < b.second) {
     548        if (a.first < b.first)
     549          return true;
     550        else if (a.first > b.first)
     551          return false;
     552        else
     553          return (a.second < b.second);
     554      } else {
     555        if (a.first < b.second)
     556          return true;
     557        else if (a.first > b.second)
     558          return false;
     559        else
     560          return (a.second < b.first);
     561      }
     562    } else {
     563      if (b.first < b.second) {
     564        if (a.second < b.first)
     565          return true;
     566        else if (a.second > b.first)
     567          return false;
     568        else
     569          return (a.first < b.second);
     570      } else {
     571        if (a.second < b.second)
     572          return true;
     573        else if (a.second > b.second)
     574          return false;
     575        else
     576          return (a.first < b.first);
     577      }
     578    }
     579  }
     580};
     581
     582std::ostream& operator<<(std::ostream &out, const argument_t::types_t &a)
     583{
     584  out << "[" << a.first << "," << a.second << "]";
     585  return out;
     586}
     587
    540588FunctionModel::arguments_t Extractors::reorderArgumentsByParticleTypes(
     589    const FunctionModel::arguments_t &args,
     590    const ParticleTypes_t &_types
     591    )
     592{
     593  /// We  place all arguments into multimap according to particle type pair.
     594  // here, we need a special comparator such that types in key pair are always
     595  // properly ordered.
     596  typedef std::multimap<
     597      argument_t::types_t,
     598      argument_t,
     599      ParticleTypesComparator> TypePair_Argument_Map_t;
     600  TypePair_Argument_Map_t argument_map;
     601  for(FunctionModel::arguments_t::const_iterator iter = args.begin();
     602      iter != args.end(); ++iter) {
     603    argument_map.insert( std::make_pair(iter->types, *iter) );
     604  }
     605  LOG(4, "DEBUG: particle_type map is " << argument_map << ".");
     606
     607  /// Then, we create the desired unique keys
     608  typedef std::vector<argument_t::types_t> UniqueTypes_t;
     609  UniqueTypes_t UniqueTypes;
     610  for (ParticleTypes_t::const_iterator firstiter = _types.begin();
     611      firstiter != _types.end();
     612      ++firstiter) {
     613    for (ParticleTypes_t::const_iterator seconditer = firstiter;
     614        seconditer != _types.end();
     615        ++seconditer) {
     616      if (seconditer == firstiter)
     617        continue;
     618      UniqueTypes.push_back( std::make_pair(*firstiter, *seconditer) );
     619    }
     620  }
     621  LOG(4, "DEBUG: Created unique types as keys " << UniqueTypes << ".");
     622
     623  /// Finally, we use the unique key list to pick corresponding arguments from the map
     624  FunctionModel::arguments_t returnargs;
     625  returnargs.reserve(args.size());
     626  while (!argument_map.empty()) {
     627    // note that particle_types_t may be flipped, i.e. 1,8 is equal to 8,1, but we
     628    // must maintain the correct order in indices in accordance with the order
     629    // in _types, i.e. 1,8,1 must match with e.g. ids 1,0,2 where 1 has type 1,
     630    // 0 has type 8, and 2 has type 2.
     631    // In other words: We do not want to flip/modify arguments such that they match
     632    // with the specific type pair we seek but then this comes at the price that we
     633    // have flip indices when the types in a pair are flipped.
     634
     635    typedef std::vector<size_t> indices_t;
     636    //!> here, we gather the indices as we discover them
     637    indices_t indices;
     638    indices.resize(_types.size(), (size_t)-1);
     639
     640    // these are two iterators that create index pairs in the same way as we have
     641    // created type pairs. If a -1 is still present in indices, then the index is
     642    // still arbitrary but is then set by the next found index
     643    indices_t::iterator firstindex = indices.begin();
     644    indices_t::iterator secondindex = firstindex+1;
     645
     646    //!> here, we gather the current bunch of arguments as we find them
     647    FunctionModel::arguments_t argumentbunch;
     648    argumentbunch.reserve(UniqueTypes.size());
     649
     650    for (UniqueTypes_t::const_iterator typeiter = UniqueTypes.begin();
     651        typeiter != UniqueTypes.end(); ++typeiter) {
     652      // have all arguments to same type pair as list within the found range
     653      std::pair<
     654          TypePair_Argument_Map_t::iterator,
     655          TypePair_Argument_Map_t::iterator> range_t =
     656              argument_map.equal_range(*typeiter);
     657      LOG(4, "DEBUG: Set of arguments to current key [" << typeiter->first << ","
     658          << typeiter->second << "] is " << std::list<argument_t>(
     659              MapValueIterator<TypePair_Argument_Map_t::iterator>(range_t.first),
     660              MapValueIterator<TypePair_Argument_Map_t::iterator>(range_t.second)
     661              ) << ".");
     662      // the first key is always easy and is pivot which the rest has to be associated to
     663      if (typeiter == UniqueTypes.begin()) {
     664        const argument_t & arg = range_t.first->second;
     665        if ((typeiter->first == arg.types.first) && (typeiter->second == arg.types.second)) {
     666          // store in correct order
     667          *firstindex = arg.indices.first;
     668          *secondindex = arg.indices.second;
     669        } else {
     670          // store in flipped order
     671          *firstindex = arg.indices.second;
     672          *secondindex = arg.indices.first;
     673        }
     674        argumentbunch.push_back(arg);
     675        argument_map.erase(range_t.first);
     676        LOG(4, "DEBUG: Gathered first argument " << arg << ".");
     677      } else {
     678        // go through the range and pick the first argument matching the index constraints
     679        for (TypePair_Argument_Map_t::iterator argiter = range_t.first;
     680            argiter != range_t.second; ++argiter) {
     681          // seconditer may be -1 still
     682          const argument_t &arg = argiter->second;
     683          if (arg.indices.first == *firstindex) {
     684            if ((arg.indices.second == *secondindex) || (*secondindex == (size_t)-1)) {
     685              if (*secondindex == -1)
     686                *secondindex = arg.indices.second;
     687              argumentbunch.push_back(arg);
     688              argument_map.erase(argiter);
     689              LOG(4, "DEBUG: Gathered another argument " << arg << ".");
     690              break;
     691            }
     692          } else if ((arg.indices.first == *secondindex) || (*secondindex == (size_t)-1)) {
     693            if (arg.indices.second == *firstindex) {
     694              if (*secondindex == (size_t)-1)
     695                *secondindex = arg.indices.first;
     696              argumentbunch.push_back(arg);
     697              argument_map.erase(argiter);
     698              LOG(4, "DEBUG: Gathered another (flipped) argument " << arg << ".");
     699              break;
     700            }
     701          }
     702        }
     703      }
     704      // move along in indices and check bounds
     705      ++secondindex;
     706      if (secondindex == indices.end()) {
     707        ++firstindex;
     708        if (firstindex != indices.end()-1)
     709          secondindex = firstindex+1;
     710      }
     711    }
     712    ASSERT( (firstindex == indices.end()-1) && (secondindex == indices.end()),
     713        "Extractors::reorderArgumentsByParticleTypes() - we have not gathered enough arguments.");
     714    ASSERT( argumentbunch.size() == UniqueTypes.size(),
     715        "Extractors::reorderArgumentsByParticleTypes() - we have not gathered enough arguments.");
     716    // place bunch of arguments in return args
     717    LOG(3, "DEBUG: Given types " << _types << " and found indices " << indices << ".");
     718    LOG(3, "DEBUG: Final bunch of arguments is " << argumentbunch << ".");
     719    returnargs.insert(returnargs.end(), argumentbunch.begin(), argumentbunch.end());
     720  }
     721
     722  return returnargs;
     723}
     724
     725FunctionModel::arguments_t Extractors::filterArgumentsByParticleTypes(
    541726    const FunctionModel::arguments_t &args,
    542727    const ParticleTypes_t &_types
     
    557742
    558743  // basically, we have two choose any two pairs out of types but only those
    559   // where the first is less than the letter. Hence, we start the second
     744  // where the first is less than the latter. Hence, we start the second
    560745  // iterator at the current position of the first one and skip the equal case.
    561746  for (ParticleTypes_t::const_iterator firstiter = _types.begin();
     
    580765        else if ((iter->types.first == *seconditer)
    581766              && (iter->types.second == *firstiter)) {
    582           argument_t flippedtypes(*iter);
    583           std::swap( flippedtypes.indices.first, flippedtypes.indices.second );
    584           std::swap( flippedtypes.types.first, flippedtypes.types.second );
    585           returnargs.push_back( flippedtypes );
    586           break;
     767//          argument_t flippedtypes(*iter);
     768//          std::swap( flippedtypes.indices.first, flippedtypes.indices.second );
     769//          std::swap( flippedtypes.types.first, flippedtypes.types.second );
     770          returnargs.push_back( *iter );
     771          iter = availableList.erase(iter);
     772          LOG(4, "DEBUG: Accepted (flipped) argument.");
     773        } else {
     774          ++iter;
     775          LOG(4, "DEBUG: Rejected argument.");
    587776        }
    588777      }
Note: See TracChangeset for help on using the changeset viewer.