Changeset 311da7b


Ignore:
Timestamp:
Feb 10, 2011, 6:58:48 PM (14 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:
b6b3b2
Parents:
4cbca0
git-author:
Frederik Heber <heber@…> (02/10/11 18:36:56)
git-committer:
Frederik Heber <heber@…> (02/10/11 18:58:48)
Message:

FIX: Changed MpqcParser.

  • some ASSERTs were missing and showed up failure in parsings.
  • in MpqcSection keywords molecule and basis are now ignored.
  • BUGFIX: due to missing whitespacefilter most of the keys were actually not really parsed which lead to strange "A'" and ""A'"" behavior, because in unit test key was without whitespace, hence recognized (and there we switch theories from CLHF parsed file only), whereas in regression test key was not recognized.
  • TESTFIX: ParserMpqcUnitTest - now checks whether MpqcParser_Parameters:: getInt() throws and also if ::operator>> throws in case of debugging.
Location:
src/Parser
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/MpqcParser.cpp

    r4cbca0 r311da7b  
    6464  boost::char_separator<char> sep("[]");
    6565  boost::char_separator<char> angularsep("<>");
    66   boost::char_separator<char> equalitysep("=");
     66  boost::char_separator<char> equalitysep(" =");
    6767  boost::char_separator<char> whitesep(" \t");
    6868  ConvertTo<double> toDouble;
     
    9090  //        throw MpqcParseException;
    9191        tokenizer::iterator tok_iter = tokens.begin();
     92        ASSERT(tok_iter != tokens.end(),
     93            "MpqcParser::load() - missing token for MoleculeSection in line "+linestring+"!");
    9294        std::stringstream whitespacefilter(*tok_iter++);
    9395        std::string element;
    94         whitespacefilter >> element;
     96        whitespacefilter >> ws >> element;
     97        ASSERT(tok_iter != tokens.end(),
     98            "MpqcParser::load() - missing token for MoleculeSection in line "+linestring+"!");
    9599        std::string vector = *tok_iter;
    96100        tokenizer vectorcomponents(vector, whitesep);
     
    111115    }
    112116    if (MpqcSection) {
    113       tokenizer tokens(linestring, equalitysep);
    114       tokenizer::iterator tok_iter = tokens.begin();
    115       std::stringstream whitespacefilter(*tok_iter++);
    116       std::string key(*tok_iter++);
    117       if (params.haveParam(key)) {
    118         std::stringstream linestream(linestring);
    119         linestream >> params;
    120       } else if (linestring.find("mole<") != string::npos) { // get theory
     117      if (linestring.find("mole<") != string::npos) { // get theory
    121118        tokenizer tokens(linestring, angularsep);
    122119        tokenizer::iterator tok_iter = tokens.begin();
    123         std::string value(*(++tok_iter));
     120        ++tok_iter;
     121        ASSERT(tok_iter != tokens.end(),
     122            "MpqcParser::load() - missing token in brackets<> for mole< in line "+linestring+"!");
     123        std::string value(*tok_iter);
    124124        std::stringstream linestream("theory = "+value);
    125125        linestream >> params;
     
    127127        tokenizer tokens(linestring, angularsep);
    128128        tokenizer::iterator tok_iter = tokens.begin();
    129         std::string value(*(++tok_iter));
     129        ++tok_iter;
     130        ASSERT(tok_iter != tokens.end(),
     131            "MpqcParser::load() - missing token in brackets<> for integrals< in line "+linestring+"!");
     132        std::string value(*tok_iter);
    130133        std::stringstream linestream("integration = "+value);
    131134        linestream >> params;
     135      } else if ((linestring.find("molecule") == string::npos) && (linestring.find("basis") == string::npos)){
     136        // molecule and basis must not be parsed in this section
     137        tokenizer tokens(linestring, equalitysep);
     138        tokenizer::iterator tok_iter = tokens.begin();
     139        ASSERT(tok_iter != tokens.end(),
     140            "MpqcParser::load() - missing token before '=' for MpqcSection in line "+linestring+"!");
     141        std::stringstream whitespacefilter(*tok_iter);
     142        std::string key;
     143        whitespacefilter >> ws >> key;
     144        if (params.haveParam(key)) {
     145          std::stringstream linestream(linestring);
     146          linestream >> params;
     147        } else { // unknown keys are simply ignored as long as parser is incomplete
     148          DoLog(2) && (Log() << Verbose(2) << "INFO: '"+key+"' is unknown and ignored." << std::endl);
     149        }
    132150      }
    133151    }
     
    135153      tokenizer tokens(linestring, equalitysep);
    136154      tokenizer::iterator tok_iter = tokens.begin();
     155      ASSERT(tok_iter != tokens.end(),
     156          "MpqcParser::load() - missing token for BasisSection in line "+linestring+"!");
    137157      std::string key(*tok_iter++);
     158      ASSERT(tok_iter != tokens.end(),
     159          "MpqcParser::load() - missing value for BasisSection after key "+key+" in line "+linestring+"!");
    138160      std::string value(*tok_iter);
     161      tok_iter++;
    139162      // TODO: use exception instead of ASSERT
    140163      ASSERT(tok_iter == tokens.end(),
     
    148171      tokenizer tokens(linestring, equalitysep);
    149172      tokenizer::iterator tok_iter = tokens.begin();
     173      ASSERT(tok_iter != tokens.end(),
     174          "MpqcParser::load() - missing token for AuxBasisSection in line "+linestring+"!");
    150175      std::string key(*tok_iter++);
     176      ASSERT(tok_iter != tokens.end(),
     177          "MpqcParser::load() - missing value for BasisSection after key "+key+" in line "+linestring+"!");
    151178      std::string value(*tok_iter);
     179      tok_iter++;
    152180      // TODO: use exception instead of ASSERT
    153181      ASSERT(tok_iter == tokens.end(),
  • src/Parser/MpqcParser_Parameters.cpp

    r4cbca0 r311da7b  
    152152  boost::char_separator<char> semicolonsep(";");
    153153  boost::char_separator<char> equalitysep(" =");
     154  boost::char_separator<char> ticksep("\"");
    154155  std::string line;
    155156  std::getline( ist, line );
     
    157158  tokenizer tokens(line, semicolonsep);
    158159  ASSERT(tokens.begin() != tokens.end(),
    159       "operator<< on MpqcParser_Parameters - empty string, need at least ';'!");
     160      "operator<< on MpqcParser_Parameters - empty string, need at least ';' in line "+line+"!");
    160161  for (tokenizer::iterator tok_iter = tokens.begin();
    161162        tok_iter != tokens.end(); ++tok_iter) {
     
    165166      tokenizer::iterator tok_valueiter = tok_paramiter;
    166167      tokenizer::iterator tok_checkiter = ++tok_valueiter;
     168      ++tok_checkiter;
    167169      // TODO: throw exception instead of ASSERT
    168       ASSERT(tok_valueiter == params.end(),
    169           "operator<< on MpqcParser_Parameters - missing value before ';'!");
    170       ++tok_checkiter;
    171       ASSERT(tok_checkiter == params.end(),
    172           "operator<< on MpqcParser_Parameters - still tokens before ';'!");
    173       DoLog(0) && (Log() << Verbose(0)
    174           << "INFO: Token pair is " << *tok_paramiter << "," << *tok_valueiter << std::endl);
    175       std::stringstream value(*tok_valueiter);
     170      ASSERT(tok_paramiter != paramtokens.end(),
     171          "operator<< on MpqcParser_Parameters - missing value before ' =' in token "+*tok_iter+"!");
     172      ASSERT(tok_valueiter != paramtokens.end(),
     173          "operator<< on MpqcParser_Parameters - missing value after ' =' in token "+*tok_iter+"!");
     174      ASSERT(tok_checkiter == paramtokens.end(),
     175          "operator<< on MpqcParser_Parameters - still more tokens after ' =' in token "+*tok_iter+":"
     176          +*tok_checkiter+"!");
     177      std::stringstream keystream(*tok_paramiter);
     178      std::string key;
     179      keystream >> ws >> key;
     180      tokenizer ticklesstokens(*tok_valueiter, ticksep);
     181      ASSERT(ticklesstokens.begin() != ticklesstokens.end(),
     182          "operator<< on MpqcParser_Parameters - no tokens present after removing ticks in token "+*tok_valueiter+"!");
     183      std::stringstream valuestream(*(ticklesstokens.begin()));
     184      DoLog(2) && (Log() << Verbose(2)
     185          << "INFO: Token pair is " << key << "," << valuestream.str() << std::endl);
    176186
    177187      // TODO: throw exception instead of DoeLog()
    178       if ((params.haveParam(*tok_paramiter))) {
    179         params.setter(params.getParam(*tok_paramiter), value);
    180       } else {
    181         DoeLog(0) && (eLog() << Verbose(0)
    182             << *tok_paramiter << " is not a valid parameter name!" << std::endl);
    183       }
     188      ASSERT(params.haveParam(key),
     189          "operator >> on MpqcParser_Parameters - unknown parameter name '"
     190          +key+"' with value "+valuestream.str()+"!");
     191      if (params.haveParam(key))
     192        params.setter(params.getParam(key), valuestream);
    184193    } else {
    185194      ist.setstate(std::ios::eofbit);
     
    247256{
    248257  // TODO: throw exception instead of eLog()
    249   try {
     258//  try {
    250259    params[theoryParam] = _theory;
    251   } catch(const boost::bad_any_cast &) {
    252     DoeLog(0) && (eLog() << Verbose(0)
    253         << "MpqcParser_Parameters::setTheory() - could not set boolean!" << std::endl);
    254   }
     260//  } catch(const boost::bad_any_cast &) {
     261//    DoeLog(0) && (eLog() << Verbose(0)
     262//        << "MpqcParser_Parameters::setTheory() - could not set boolean!" << std::endl);
     263//  }
    255264}
    256265
    257266void MpqcParser_Parameters::setIntegration(enum MpqcParser_Parameters::IntegrationMethod _integration){
    258267  // TODO: throw exception instead of eLog()
    259   try {
     268//  try {
    260269    params[integrationParam] = _integration;
    261   } catch(const boost::bad_any_cast &) {
    262     DoeLog(0) && (eLog() << Verbose(0)
    263         << "MpqcParser_Parameters::setIntegration() - could not set boolean!" << std::endl);
    264   }
     270//  } catch(const boost::bad_any_cast &) {
     271//    DoeLog(0) && (eLog() << Verbose(0)
     272//        << "MpqcParser_Parameters::setIntegration() - could not set boolean!" << std::endl);
     273//  }
    265274}
    266275
     
    279288  enum IntegrationMethod value;
    280289  // TODO: throw exception instead of eLog()
    281   try {
     290//  try {
    282291    value = boost::any_cast<enum IntegrationMethod>(params[integrationParam]);
    283   } catch(const boost::bad_any_cast &) {
    284     DoeLog(0) && (eLog() << Verbose(0)
    285         << "MpqcParser_Parameters::getIntegration() - could not convert "
    286         +ParamNames[integrationParam]+" to enum IntegrationMethod!" << std::endl);
    287   }
     292//  } catch(const boost::bad_any_cast &) {
     293//    DoeLog(0) && (eLog() << Verbose(0)
     294//        << "MpqcParser_Parameters::getIntegration() - could not convert "
     295//        +ParamNames[integrationParam]+" to enum IntegrationMethod!" << std::endl);
     296//  }
    288297  return value;
    289298}
     
    293302  enum Theory value;
    294303  // TODO: throw exception instead of eLog()
    295   try {
     304//  try {
    296305    value = boost::any_cast<enum Theory>(params[theoryParam]);
    297   } catch(const boost::bad_any_cast &) {
    298     DoeLog(0) && (eLog() << Verbose(0)
    299         << "MpqcParser_Parameters::getTheory() - could not convert "
    300         +ParamNames[theoryParam]+" to enum Theory!" << std::endl);
    301   }
     306//  } catch(const boost::bad_any_cast &) {
     307//    DoeLog(0) && (eLog() << Verbose(0)
     308//        << "MpqcParser_Parameters::getTheory() - could not convert "
     309//        +ParamNames[theoryParam]+" to enum Theory!" << std::endl);
     310//  }
    302311  return value;
    303312}
     
    321330    case integrationParam:
    322331      // TODO: throw exception instead of eLog()
    323       try {
     332//      try {
    324333        Iindex = boost::any_cast<enum IntegrationMethod>(params[_param]);
    325       } catch(const boost::bad_any_cast &) {
    326         DoeLog(0) && (eLog() << Verbose(0)
    327             << "MpqcParser_Parameters::getString() - could not convert "
    328             +ParamNames[_param]+" to string!" << std::endl);
    329       }
     334//      } catch(const boost::bad_any_cast &) {
     335//        DoeLog(0) && (eLog() << Verbose(0)
     336//            << "MpqcParser_Parameters::getString() - could not convert "
     337//            +ParamNames[_param]+" to string!" << std::endl);
     338//      }
    330339      value = IntegrationNames[Iindex];
    331340      break;
    332341    case theoryParam:
    333342      // TODO: throw exception instead of eLog()
    334       try {
     343//      try {
    335344        Tindex = boost::any_cast<enum Theory>(params[_param]);
    336       } catch(const boost::bad_any_cast &) {
    337         DoeLog(0) && (eLog() << Verbose(0)
    338             << "MpqcParser_Parameters::getString() - could not convert "
    339             +ParamNames[_param]+" to string!" << std::endl);
    340       }
     345//      } catch(const boost::bad_any_cast &) {
     346//        DoeLog(0) && (eLog() << Verbose(0)
     347//            << "MpqcParser_Parameters::getString() - could not convert "
     348//            +ParamNames[_param]+" to string!" << std::endl);
     349//      }
    341350      value = TheoryNames[(enum Theory)Tindex];
    342351      break;
    343352    default:
    344353      // TODO: throw exception instead of eLog()
    345       try {
     354//      try {
    346355        value = boost::any_cast<std::string>(params[_param]);
    347       } catch(const boost::bad_any_cast &) {
    348         DoeLog(0) && (eLog() << Verbose(0)
    349             << "MpqcParser_Parameters::getString() - could not convert "
    350             +ParamNames[_param]+" to string!" << std::endl);
    351       }
     356//      } catch(const boost::bad_any_cast &) {
     357//        DoeLog(0) && (eLog() << Verbose(0)
     358//            << "MpqcParser_Parameters::getString() - could not convert "
     359//            +ParamNames[_param]+" to string!" << std::endl);
     360//      }
    352361      break;
    353362  }
     
    362371    default:
    363372      // TODO: throw exception instead of eLog()
    364       try {
     373//      try {
    365374        value = boost::any_cast<int>(params[_param]);
    366       } catch(const boost::bad_any_cast &) {
    367         DoeLog(0) && (eLog() << Verbose(0)
    368             << "MpqcParser_Parameters::getInt() - could not convert "
    369             +ParamNames[_param]+" to int!" << std::endl);
    370       }
     375//      } catch(const boost::bad_any_cast &) {
     376//        DoeLog(0) && (eLog() << Verbose(0)
     377//            << "MpqcParser_Parameters::getInt() - could not convert "
     378//            +ParamNames[_param]+" to int!" << std::endl);
     379//      }
    371380      break;
    372381  }
     
    378387  double value;
    379388  // TODO: throw exception instead of eLog()
    380   try {
     389//  try {
    381390    value = boost::any_cast<double>(params[_param]);
    382   } catch(const boost::bad_any_cast &) {
    383     DoeLog(0) && (eLog() << Verbose(0)
    384         << "MpqcParser_Parameters::getDouble() - could not convert "
    385         +ParamNames[_param]+" to double!" << std::endl);
    386   }
     391//  } catch(const boost::bad_any_cast &) {
     392//    DoeLog(0) && (eLog() << Verbose(0)
     393//        << "MpqcParser_Parameters::getDouble() - could not convert "
     394//        +ParamNames[_param]+" to double!" << std::endl);
     395//  }
    387396  return value;
    388397}
     
    392401  bool value;
    393402  // TODO: throw exception instead of eLog()
    394   try {
     403//  try {
    395404    value = boost::any_cast<bool>(params[_param]);
    396   } catch(const boost::bad_any_cast &) {
    397     DoeLog(0) && (eLog() << Verbose(0)
    398         << "MpqcParser_Parameters::getBool() - could not convert "
    399         +ParamNames[_param]+" to bool!" << std::endl);
    400   }
     405//  } catch(const boost::bad_any_cast &) {
     406//    DoeLog(0) && (eLog() << Verbose(0)
     407//        << "MpqcParser_Parameters::getBool() - could not convert "
     408//        +ParamNames[_param]+" to bool!" << std::endl);
     409//  }
    401410  return value;
    402411}
  • src/Parser/unittests/ParserMpqcUnitTest.cpp

    r4cbca0 r311da7b  
    3131#include "periodentafel.hpp"
    3232#include "Descriptors/AtomTypeDescriptor.hpp"
     33#include "CodePatterns/Assert.hpp"
    3334
    3435#ifdef HAVE_TESTRUNNER
     
    214215
    215216  // check throw, for the moment aren't, are caught in getInt()
    216   //CPPUNIT_ASSERT_THROW(mpqc->params.getInt(MpqcParser_Parameters::integrationParam), boost::bad_any_cast);
    217   //CPPUNIT_ASSERT_THROW(mpqc->params.getInt(MpqcParser_Parameters::theoryParam), boost::bad_any_cast);
     217  CPPUNIT_ASSERT_THROW(mpqc->params.getInt(MpqcParser_Parameters::integrationParam), boost::bad_any_cast);
     218  CPPUNIT_ASSERT_THROW(mpqc->params.getInt(MpqcParser_Parameters::theoryParam), boost::bad_any_cast);
    218219
    219220}
     
    245246  }
    246247  // test whether unknown key fails
    247   std::cout << "The following CRITICAL warning is desired and does not indicate a failure of the test." << std::endl;
     248  std::cout << "The following Assertion warning is desired and does not indicate a failure of the test." << std::endl;
    248249  {
    249250    std::stringstream setvalue("hessian = no");
     251#ifndef NDEBUG
     252    ASSERT_DO(Assert::Throw);
     253    CPPUNIT_ASSERT_THROW(setvalue >> mpqc->params, Assert::AssertionFailure);
     254#else
    250255    setvalue >> mpqc->params;
     256#endif
    251257//    std::cout << "Hessian is still "
    252258//        << mpqc->params.getString(MpqcParser_Parameters::hessianParam) << std::endl;
Note: See TracChangeset for help on using the changeset viewer.