Changes in / [2ed3bf:9e1bfb]


Ignore:
Files:
11 added
8 edited

Legend:

Unmodified
Added
Removed
  • doc/userguide/userguide.xml

    r2ed3bf r9e1bfb  
    21232123            a fragment of order 1, e.g. a single hydrogen atom.</para>
    21242124          </note>
     2125        </section>
     2126
     2127        <section xml:id='potentials.fit-compound-potential'>
     2128          <title xml:id='potentials.fit-compound-potential.title'>Fitting
     2129          many empirical potentials simultaneously</title>
     2130
    21252131
    21262132          <para>Another way is using a file containing a specific set of
     
    21282134
    21292135          <programlisting>
    2130                 ... --fit-potential \
     2136                ... --fit-compound-potential \
    21312137                    --fragment-charges 8 1 1 \
    21322138                    --potential-file water.potentials \
     
    21502156          type of analysis.</para>
    21512157
    2152           <para>Note that you can combine the two ways, i.e. start with the
    2153           first but give an empty potential file. The resulting parameters are
    2154           stored in this way. Fit other potentials and give different file
    2155           names for each. Eventually, you have to combine the file in a text
    2156           editor at the moment.</para>
     2158          <para>Note that you can combine the two ways, i.e. start with a
     2159          fit-potential call but give an empty potential file. The resulting
     2160          parameters are stored in it. Fit other potentials and give different
     2161          file names for each in turn. Eventually, you have to combine the file
     2162          in a text editor at the moment. And perform a fit-compound-potential
     2163          with this file.</para>
     2164        </section>
     2165
     2166       
     2167        <section xml:id='potentials.parse-potential'>
     2168          <title xml:id='potentials.parse-potential.title'>Parsing an
     2169          empirical potentials file</title>
     2170
     2171          <para>Responsible for the compound potential is every potential
     2172          function whose signature matches with the designated fragment-charges
     2173          and who is currently known to an internal instance called the
     2174          PotentialRegistry.</para>
     2175
     2176          <para>More potentials can be registered (fit-potential will also
     2177          register the potential it fits) by parsing them from a file.</para>
     2178
     2179          <programlisting>
     2180                ... --parse-potentials water.potentials
     2181          </programlisting>
     2182
     2183          <note>Currently, only <productname>TREMOLO</productname> potential
     2184          files are understood and can be parsed.</note>
     2185        </section>
     2186
     2187        <section xml:id='potentials.save-potential'>
     2188          <title xml:id='potentials.save-potential.title'>Saving an
     2189          empirical potentials file</title>
     2190
     2191          <para>The opposite to parse-potentials is save-potentials that writes
     2192          every potential currently known to the PotentialRegistry to the given
     2193          file along with the currently fitted parameters</para>
     2194
     2195          <programlisting>
     2196                ... --save-potentials water.potentials
     2197          </programlisting>
     2198
     2199          <note>Again, only the <productname>TREMOLO</productname> potential
     2200          format is understood currently and is written.</note>
    21572201        </section>
    21582202
  • src/Actions/GlobalListOfActions.hpp

    r2ed3bf r9e1bfb  
    8484  (PotentialFitParticleCharges) \
    8585  (PotentialParseHomologies) \
     86  (PotentialParsePotentials) \
    8687  (PotentialSaveHomologies) \
     88  (PotentialSavePotentials) \
    8789  (ParserParseTremoloPotentials) \
    8890  (ParserSaveSelectedAtomsAsExtTypes) \
     
    149151#define GLOBALLISTOFACTIONS_LEVMAR \
    150152    BOOST_PP_SEQ_PUSH_BACK( \
    151         GLOBALLISTOFACTIONS_initial, \
    152         PotentialFitPotential \
     153                BOOST_PP_SEQ_PUSH_BACK( \
     154                                GLOBALLISTOFACTIONS_initial, \
     155                                PotentialFitPotential \
     156                ), \
     157        PotentialFitCompoundPotential \
    153158    )
    154159#else
  • src/Actions/Makefile.am

    r2ed3bf r9e1bfb  
    354354  Actions/PotentialAction/FitParticleChargesAction.cpp \
    355355  Actions/PotentialAction/ParseHomologiesAction.cpp \
    356   Actions/PotentialAction/SaveHomologiesAction.cpp
     356  Actions/PotentialAction/ParsePotentialsAction.cpp \
     357  Actions/PotentialAction/SaveHomologiesAction.cpp \
     358  Actions/PotentialAction/SavePotentialsAction.cpp
    357359POTENTIALACTIONHEADER = \
    358360  Actions/PotentialAction/FitParticleChargesAction.hpp \
    359361  Actions/PotentialAction/ParseHomologiesAction.hpp \
    360   Actions/PotentialAction/SaveHomologiesAction.hpp
     362  Actions/PotentialAction/ParsePotentialsAction.hpp \
     363  Actions/PotentialAction/SaveHomologiesAction.hpp \
     364  Actions/PotentialAction/SavePotentialsAction.hpp
    361365POTENTIALACTIONDEFS = \
    362366  Actions/PotentialAction/FitParticleChargesAction.def  \
    363367  Actions/PotentialAction/ParseHomologiesAction.def \
    364   Actions/PotentialAction/SaveHomologiesAction.def
     368  Actions/PotentialAction/ParsePotentialsAction.def \
     369  Actions/PotentialAction/SaveHomologiesAction.def \
     370  Actions/PotentialAction/SavePotentialsAction.def
    365371
    366372if CONDLEVMAR
    367373POTENTIALACTIONSOURCE += \
     374  Actions/PotentialAction/FitCompoundPotentialAction.cpp \
    368375  Actions/PotentialAction/FitPotentialAction.cpp
    369376POTENTIALACTIONHEADER += \
     377  Actions/PotentialAction/FitCompoundPotentialAction.hpp \
    370378  Actions/PotentialAction/FitPotentialAction.hpp
    371379POTENTIALACTIONDEFS += \
     380  Actions/PotentialAction/FitCompoundPotentialAction.def \
    372381  Actions/PotentialAction/FitPotentialAction.def
    373382endif
  • src/Actions/PotentialAction/FitPotentialAction.cpp

    r2ed3bf r9e1bfb  
    5555#include "Fragmentation/Homology/HomologyGraph.hpp"
    5656#include "Fragmentation/Summation/SetValues/Fragment.hpp"
    57 #include "FunctionApproximation/Extractors.hpp"
    58 #include "FunctionApproximation/FunctionApproximation.hpp"
    59 #include "FunctionApproximation/FunctionModel.hpp"
    60 #include "FunctionApproximation/TrainingData.hpp"
    61 #include "FunctionApproximation/writeDistanceEnergyTable.hpp"
    62 #include "Potentials/CompoundPotential.hpp"
    63 #include "Potentials/Exceptions.hpp"
    64 #include "Potentials/PotentialDeserializer.hpp"
     57#include "Potentials/EmpiricalPotential.hpp"
    6558#include "Potentials/PotentialFactory.hpp"
    6659#include "Potentials/PotentialRegistry.hpp"
    6760#include "Potentials/PotentialSerializer.hpp"
     61#include "Potentials/PotentialTrainer.hpp"
    6862#include "Potentials/SerializablePotential.hpp"
     63#include "World.hpp"
    6964
    7065using namespace MoleCuilder;
     
    7570/** =========== define the function ====================== */
    7671
    77 HomologyGraph getFirstGraphwithSpecifiedElements(
    78     const HomologyContainer &homologies,
    79     const SerializablePotential::ParticleTypes_t &types)
    80 {
    81   ASSERT( !types.empty(),
    82       "getFirstGraphwithSpecifiedElements() - charges is empty?");
    83   // create charges
    84   Fragment::charges_t charges;
    85   charges.resize(types.size());
    86   std::transform(types.begin(), types.end(),
    87       charges.begin(), boost::lambda::_1);
    88   // convert into count map
    89   Extractors::elementcounts_t counts_per_charge =
    90       Extractors::_detail::getElementCounts(charges);
    91   ASSERT( !counts_per_charge.empty(),
    92       "getFirstGraphwithSpecifiedElements() - charge counts are empty?");
    93   LOG(2, "DEBUG: counts_per_charge is " << counts_per_charge << ".");
    94   // we want to check each (unique) key only once
    95   for (HomologyContainer::const_key_iterator iter = homologies.key_begin();
    96       iter != homologies.key_end(); iter = homologies.getNextKey(iter)) {
    97     // check if every element has the right number of counts
    98     Extractors::elementcounts_t::const_iterator countiter = counts_per_charge.begin();
    99     for (; countiter != counts_per_charge.end(); ++countiter)
    100       if (!(*iter).hasTimesAtomicNumber(
    101           static_cast<size_t>(countiter->first),
    102           static_cast<size_t>(countiter->second))
    103           )
    104         break;
    105     if( countiter == counts_per_charge.end())
    106       return *iter;
    107   }
    108   return HomologyGraph();
    109 }
    110 
    111 SerializablePotential::ParticleTypes_t getNumbersFromElements(
    112     const std::vector<const element *> &fragment)
    113 {
    114   SerializablePotential::ParticleTypes_t fragmentnumbers;
    115   std::transform(fragment.begin(), fragment.end(), std::back_inserter(fragmentnumbers),
    116       boost::bind(&element::getAtomicNumber, _1));
    117   return fragmentnumbers;
    118 }
    119 
    120 
    12172ActionState::ptr PotentialFitPotentialAction::performCall() {
    12273  // fragment specifies the homology fragment to use
    12374  SerializablePotential::ParticleTypes_t fragmentnumbers =
    124       getNumbersFromElements(params.fragment.get());
     75      PotentialTrainer::getNumbersFromElements(params.fragment.get());
    12576
    12677  // either charges and a potential is specified or a file
    127   if (boost::filesystem::exists(params.potential_file.get())) {
    128     std::ifstream returnstream(params.potential_file.get().string().c_str());
    129     if (returnstream.good()) {
    130       try {
    131         PotentialDeserializer deserialize(returnstream);
    132         deserialize();
    133       } catch (SerializablePotentialMissingValueException &e) {
    134         if (const std::string *key = boost::get_error_info<SerializablePotentialKey>(e))
    135           STATUS("Missing value when parsing information for potential "+*key+".");
    136         else
    137           STATUS("Missing value parsing information for potential with unknown key.");
    138         return Action::failure;
    139       } catch (SerializablePotentialIllegalKeyException &e) {
    140         if (const std::string *key = boost::get_error_info<SerializablePotentialKey>(e))
    141           STATUS("Illegal key parsing information for potential "+*key+".");
    142         else
    143           STATUS("Illegal key parsing information for potential with unknown key.");
    144         return Action::failure;
    145       }
    146     } else {
    147       STATUS("Failed to parse from "+params.potential_file.get().string()+".");
    148       return Action::failure;
     78  if (params.charges.get().empty()) {
     79    STATUS("No charges given!");
     80    return Action::failure;
     81  } else {
     82    // charges specify the potential type
     83    SerializablePotential::ParticleTypes_t chargenumbers =
     84        PotentialTrainer::getNumbersFromElements(params.charges.get());
     85
     86    LOG(0, "STATUS: I'm training now a " << params.potentialtype.get()
     87        << " potential on charges " << chargenumbers << " on data from World's homologies.");
     88
     89    // register desired potential and an additional constant one
     90    {
     91      EmpiricalPotential *potential =
     92          PotentialFactory::getInstance().createInstance(
     93              params.potentialtype.get(),
     94              chargenumbers);
     95      // check whether such a potential already exists
     96      const std::string potential_name = potential->getName();
     97      if (PotentialRegistry::getInstance().isPresentByName(potential_name)) {
     98        delete potential;
     99        potential = PotentialRegistry::getInstance().getByName(potential_name);
     100      } else
     101        PotentialRegistry::getInstance().registerInstance(potential);
    149102    }
    150     returnstream.close();
    151 
    152     LOG(0, "STATUS: I'm training now a set of potentials parsed from "
    153         << params.potential_file.get().string() << " on a fragment "
    154         << fragmentnumbers << " on data from World's homologies.");
    155 
    156   } else {
    157     if (params.charges.get().empty()) {
    158       STATUS("Neither charges nor potential file given!");
    159       return Action::failure;
    160     } else {
    161       // charges specify the potential type
    162       SerializablePotential::ParticleTypes_t chargenumbers =
    163           getNumbersFromElements(params.charges.get());
    164 
    165       LOG(0, "STATUS: I'm training now a " << params.potentialtype.get()
    166           << " potential on charges " << chargenumbers << " on data from World's homologies.");
    167 
    168       // register desired potential and an additional constant one
    169       {
    170         EmpiricalPotential *potential =
    171             PotentialFactory::getInstance().createInstance(
    172                 params.potentialtype.get(),
    173                 chargenumbers);
    174         // check whether such a potential already exists
    175         const std::string potential_name = potential->getName();
    176         if (PotentialRegistry::getInstance().isPresentByName(potential_name)) {
    177           delete potential;
    178           potential = PotentialRegistry::getInstance().getByName(potential_name);
    179         } else
    180           PotentialRegistry::getInstance().registerInstance(potential);
    181       }
    182       {
    183         EmpiricalPotential *constant =
    184             PotentialFactory::getInstance().createInstance(
    185                 std::string("constant"),
    186                 SerializablePotential::ParticleTypes_t());
    187         // check whether such a potential already exists
    188         const std::string constant_name = constant->getName();
    189         if (PotentialRegistry::getInstance().isPresentByName(constant_name)) {
    190           delete constant;
    191           constant = PotentialRegistry::getInstance().getByName(constant_name);
    192         } else
    193           PotentialRegistry::getInstance().registerInstance(constant);
    194       }
     103    {
     104      EmpiricalPotential *constant =
     105          PotentialFactory::getInstance().createInstance(
     106              std::string("constant"),
     107              SerializablePotential::ParticleTypes_t());
     108      // check whether such a potential already exists
     109      const std::string constant_name = constant->getName();
     110      if (PotentialRegistry::getInstance().isPresentByName(constant_name)) {
     111        delete constant;
     112        constant = PotentialRegistry::getInstance().getByName(constant_name);
     113      } else
     114        PotentialRegistry::getInstance().registerInstance(constant);
    195115    }
    196116  }
    197117
    198118  // parse homologies into container
    199   HomologyContainer &homologies = World::getInstance().getHomologies();
     119  const HomologyContainer &homologies = World::getInstance().getHomologies();
    200120
    201121  // first we try to look into the HomologyContainer
     
    211131
    212132  // then we ought to pick the right HomologyGraph ...
    213   const HomologyGraph graph = getFirstGraphwithSpecifiedElements(homologies,fragmentnumbers);
     133  const HomologyGraph graph =
     134      PotentialTrainer::getFirstGraphwithSpecifiedElements(homologies,fragmentnumbers);
    214135  if (graph != HomologyGraph()) {
    215136    LOG(1, "First representative graph containing fragment "
     
    220141  }
    221142
    222   // fit potential
    223   FunctionModel *model = new CompoundPotential(graph);
    224   ASSERT( model != NULL,
    225       "PotentialFitPotentialAction::performCall() - model is NULL.");
    226 
    227   /******************** TRAINING ********************/
    228   // fit potential
    229   FunctionModel::parameters_t bestparams(model->getParameterDimension(), 0.);
    230   {
    231     // Afterwards we go through all of this type and gather the distance and the energy value
    232     TrainingData data(model->getSpecificFilter());
    233     data(homologies.getHomologousGraphs(graph));
    234 
    235     // print distances and energies if desired for debugging
    236     if (!data.getTrainingInputs().empty()) {
    237       // print which distance is which
    238       size_t counter=1;
    239       if (DoLog(3)) {
    240         const FunctionModel::arguments_t &inputs = data.getAllArguments()[0];
    241         for (FunctionModel::arguments_t::const_iterator iter = inputs.begin();
    242             iter != inputs.end(); ++iter) {
    243           const argument_t &arg = *iter;
    244           LOG(3, "DEBUG: distance " << counter++ << " is between (#"
    245               << arg.indices.first << "c" << arg.types.first << ","
    246               << arg.indices.second << "c" << arg.types.second << ").");
    247         }
    248       }
    249 
    250       // print table
    251       if (params.training_file.get().string().empty()) {
    252         LOG(3, "DEBUG: I gathered the following training data:\n" <<
    253             _detail::writeDistanceEnergyTable(data.getDistanceEnergyTable()));
    254       } else {
    255         std::ofstream trainingstream(params.training_file.get().string().c_str());
    256         if (trainingstream.good()) {
    257           LOG(3, "DEBUG: Writing training data to file " <<
    258               params.training_file.get().string() << ".");
    259           trainingstream << _detail::writeDistanceEnergyTable(data.getDistanceEnergyTable());
    260         }
    261         trainingstream.close();
    262       }
    263     }
    264 
    265     if ((params.threshold.get() < 1) && (params.best_of_howmany.isSet()))
    266       ELOG(2, "threshold parameter always overrules max_runs, both are specified.");
    267     // now perform the function approximation by optimizing the model function
    268     FunctionApproximation approximator(data, *model);
    269     if (model->isBoxConstraint() && approximator.checkParameterDerivatives()) {
    270       double l2error = std::numeric_limits<double>::max();
    271       // seed with current time
    272       srand((unsigned)time(0));
    273       unsigned int runs=0;
    274       // threshold overrules max_runs
    275       const double threshold = params.threshold.get();
    276       const unsigned int max_runs = (threshold >= 1.) ?
    277           (params.best_of_howmany.isSet() ? params.best_of_howmany.get() : 1) : 0;
    278       LOG(1, "INFO: Maximum runs is " << max_runs << " and threshold set to " << threshold << ".");
    279       do {
    280         // generate new random initial parameter values
    281         model->setParametersToRandomInitialValues(data);
    282         LOG(1, "INFO: Initial parameters of run " << runs << " are "
    283             << model->getParameters() << ".");
    284         approximator(FunctionApproximation::ParameterDerivative);
    285         LOG(1, "INFO: Final parameters of run " << runs << " are "
    286             << model->getParameters() << ".");
    287         const double new_l2error = data.getL2Error(*model);
    288         if (new_l2error < l2error) {
    289           // store currently best parameters
    290           l2error = new_l2error;
    291           bestparams = model->getParameters();
    292           LOG(1, "STATUS: New fit from run " << runs
    293               << " has better error of " << l2error << ".");
    294         }
    295       } while (( ++runs < max_runs) || (l2error > threshold));
    296       // reset parameters from best fit
    297       model->setParameters(bestparams);
    298       LOG(1, "INFO: Best parameters with L2 error of "
    299           << l2error << " are " << model->getParameters() << ".");
    300     } else {
    301       STATUS("No required parameter derivatives for a box constraint minimization known.");
    302       return Action::failure;
    303     }
    304 
    305     // create a map of each fragment with error.
    306     HomologyContainer::range_t fragmentrange = homologies.getHomologousGraphs(graph);
    307     TrainingData::L2ErrorConfigurationIndexMap_t WorseFragmentMap =
    308         data.getWorstFragmentMap(*model, fragmentrange);
    309     LOG(0, "RESULT: WorstFragmentMap " << WorseFragmentMap << ".");
    310 
    311     // print fitted potentials
    312     std::stringstream potentials;
    313     PotentialSerializer serialize(potentials);
    314     serialize();
    315     LOG(1, "STATUS: Resulting parameters are " << std::endl << potentials.str());
    316     std::ofstream returnstream(params.potential_file.get().string().c_str());
    317     if (returnstream.good()) {
    318       returnstream << potentials.str();
    319     }
     143  // training
     144  PotentialTrainer trainer;
     145  const bool status = trainer(
     146      homologies,
     147      graph,
     148      params.training_file.get(),
     149      params.threshold.get(),
     150      params.best_of_howmany.get());
     151  if (!status) {
     152    STATUS("No required parameter derivatives for a box constraint minimization known.");
     153    return Action::failure;
    320154  }
    321   delete model;
    322155
    323156  return Action::success;
  • src/Actions/PotentialAction/FitPotentialAction.def

    r2ed3bf r9e1bfb  
    1818#include "Parameters/Validators/Specific/ElementValidator.hpp"
    1919#include "Parameters/Validators/Specific/EmptyStringValidator.hpp"
    20 #include "Parameters/Validators/Specific/FileSuffixValidator.hpp"
    21 #include "Parameters/Validators/Specific/FilePresentValidator.hpp"
    2220#include "Parameters/Validators/Specific/PotentialTypeValidator.hpp"
    2321
     
    2523// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    2624// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    27 #define paramtypes (boost::filesystem::path)(std::string)(boost::filesystem::path)(std::vector<const element *>)(std::vector<const element *>)(unsigned int)(double)
    28 #define paramtokens ("training-file")("potential-type")("potential-file")("potential-charges")("fragment-charges")("take-best-of")("set-threshold")
    29 #define paramdescriptions ("optional file to write training data to")("potential type to fit")("optional potential file specifying multiple potentials to fit")("charges specifying the potential")("charges specifying the fragment")("take the best among this many approximations")("Require L2 error to be smaller than threshold, overrides number of attempts")
    30 #define paramdefaults (PARAM_DEFAULT(""))(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(PARAM_DEFAULT(3))(PARAM_DEFAULT(1.))
    31 #define paramreferences (training_file)(potentialtype)(potential_file)(charges)(fragment)(best_of_howmany)(threshold)
     25#define paramtypes (boost::filesystem::path)(std::string)(std::vector<const element *>)(std::vector<const element *>)(unsigned int)(double)
     26#define paramtokens ("training-file")("potential-type")("potential-charges")("fragment-charges")("take-best-of")("set-threshold")
     27#define paramdescriptions ("optional file to write training data to")("potential type to fit")("charges specifying the potential")("charges specifying the fragment")("take the best among this many approximations")("Require L2 error to be smaller than threshold, overrides number of attempts")
     28#define paramdefaults (PARAM_DEFAULT(""))(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(PARAM_DEFAULT(3))(PARAM_DEFAULT(1.))
     29#define paramreferences (training_file)(potentialtype)(charges)(fragment)(best_of_howmany)(threshold)
    3230#define paramvalids \
    3331(DummyValidator<boost::filesystem::path>()) \
    34 (EmptyStringValidator() || PotentialTypeValidator()) \
    35 (!FilePresentValidator() || FileSuffixValidator("potentials")) \
     32(PotentialTypeValidator()) \
    3633(STLVectorValidator< std::vector<const element *> >(0,99, ElementValidator())) \
    3734(STLVectorValidator< std::vector<const element *> >(1,99, ElementValidator())) \
  • src/Potentials/Makefile.am

    r2ed3bf r9e1bfb  
    5353  Potentials/Specifics/PotentialTypes.def \
    5454  Potentials/Specifics/PotentialTypes.undef
     55
     56if CONDLEVMAR
     57POTENTIALSHEADER += \
     58  Potentials/PotentialTrainer.hpp
     59POTENTIALSSOURCE = \
     60  Potentials/PotentialTrainer.cpp
     61endif
    5562
    5663# add here headers for real potentials (i.e. the PotentialFactory should instantiate) 
  • tests/Python/AllActions/options.dat

    r2ed3bf r9e1bfb  
    125125output-types    "xyz mpqc"
    126126parse-homologies        "homology.dat"
     127parse-potentials        "water.potentials"
    127128parse-tremolo-potentials        "argon.potentials"
    128129parse-tremolo-potentials        "tensid.potentials"
     
    163164save-bonds      "test.bond"
    164165save-homologies "homology.dat"
     166save-potentials "water.potentials"
    165167save-selected-atoms     "testsave.xyz"
    166168save-selected-atoms-as-exttypes "test.exttypes"
  • tests/regression/Potential/FitPotential/testsuite-potential-fit-potential.at

    r2ed3bf r9e1bfb  
    2626AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Potential/FitPotential/pre/$file $file], 0)
    2727AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
    28 AT_CHECK([../../molecuilder --parse-homologies $file --set-random-number-engine "lagged_fibonacci607" --random-number-engine-parameters "seed=1;" --set-random-number-distribution "uniform_real" --random-number-distribution-parameters "min=0;max=1;" --fit-potential --potential-type "morse" --potential-charges 8 1 --fragment-charges 1 8 1 --set-threshold 1e-6], 0, [stdout], [ignore])
     28AT_CHECK([../../molecuilder \
     29        --parse-homologies $file \
     30        --set-random-number-engine "lagged_fibonacci607" \
     31                --random-number-engine-parameters "seed=1;" \
     32        --set-random-number-distribution "uniform_real" \
     33                --random-number-distribution-parameters "min=0;max=1;" \
     34        --fit-potential \
     35                --potential-type "morse" \
     36                --potential-charges 8 1 \
     37                --fragment-charges 1 8 1 \
     38                --set-threshold 1e-6 \
     39        --save-potentials length.potentials], 0, [stdout], [ignore])
    2940# check that L_2 error is below 1e-6
    3041AT_CHECK([grep "Best parameters with L2 error" stdout | awk '{if ($8 > 1e-6) exit 1}'], 0, [ignore], [ignore])
    3142# check parameters to printed precision
    32 AT_CHECK([grep "morse:.*particle_type1=8,.*particle_type2=1,.*spring_constant=1.27.*,.*equilibrium_distance=1.78.*,.*dissociation_energy=0.19.*;" stdout], 0, [ignore], [ignore])
     43AT_CHECK([grep "morse:.*particle_type1=8,.*particle_type2=1,.*spring_constant=1.27.*,.*equilibrium_distance=1.78.*,.*dissociation_energy=0.19.*;" length.potentials], 0, [ignore], [ignore])
    3344
    3445AT_CLEANUP
     
    4152AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Potential/FitPotential/pre/$file $file], 0)
    4253AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
    43 AT_CHECK([../../molecuilder --parse-homologies $file --set-random-number-engine "lagged_fibonacci607" --random-number-engine-parameters "seed=1;" --set-random-number-distribution "uniform_real" --random-number-distribution-parameters "min=0;max=1;" --fit-potential --potential-type "harmonic_bond" --potential-charges 8 1 --fragment-charges 1 8 1 --set-threshold 1e-6], 0, [stdout], [ignore])
     54AT_CHECK([../../molecuilder \
     55        --parse-homologies $file \
     56        --set-random-number-engine "lagged_fibonacci607" \
     57                --random-number-engine-parameters "seed=1;" \
     58        --set-random-number-distribution "uniform_real" \
     59                --random-number-distribution-parameters "min=0;max=1;" \
     60        --fit-potential \
     61                --potential-type "harmonic_bond" \
     62                --potential-charges 8 1 \
     63                --fragment-charges 1 8 1 \
     64                --set-threshold 1e-6 \
     65        --save-potentials harmonic.potentials], 0, [stdout], [ignore])
    4466# check that L_2 error is below 1e-6
    4567AT_CHECK([grep "Best parameters with L2 error" stdout | awk '{if ($8 > 1e-6) exit 1}'], 0, [ignore], [ignore])
    4668# check parameters to printed precision
    47 AT_CHECK([grep "harmonic_bond:.*particle_type1=8,.*particle_type2=1,.*spring_constant=0.29.*,.*equilibrium_distance=1.8.*;" stdout], 0, [ignore], [ignore])
     69AT_CHECK([grep "harmonic_bond:.*particle_type1=8,.*particle_type2=1,.*spring_constant=0.29.*,.*equilibrium_distance=1.8.*;" harmonic.potentials], 0, [ignore], [ignore])
    4870
    4971AT_CLEANUP
     
    5678AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Potential/FitPotential/pre/$file $file], 0)
    5779AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
    58 AT_CHECK([../../molecuilder --parse-homologies $file --set-random-number-engine "lagged_fibonacci607" --random-number-engine-parameters "seed=1;" --set-random-number-distribution "uniform_real" --random-number-distribution-parameters "min=0;max=1;" --fit-potential --potential-type "harmonic_angle" --potential-charges 1 8 1 --fragment-charges 1 8 1 --set-threshold 1e-6], 0, [stdout], [ignore])
     80AT_CHECK([../../molecuilder \
     81        --parse-homologies $file \
     82        --set-random-number-engine "lagged_fibonacci607" \
     83                --random-number-engine-parameters "seed=1;" \
     84        --set-random-number-distribution "uniform_real" \
     85                --random-number-distribution-parameters "min=0;max=1;" \
     86        --fit-potential \
     87                --potential-type "harmonic_angle" \
     88                --potential-charges 1 8 1 \
     89                --fragment-charges 1 8 1 \
     90                --set-threshold 1e-6 \
     91        --save-potentials angle.potentials], 0, [stdout], [ignore])
    5992# check that L_2 error is below 1e-6
    6093AT_CHECK([grep "||e||_2:" stdout | awk '{if ($7 > 1e-6) exit 1}'], 0, [ignore], [ignore])
    6194# check parameters to printed precision
    62 AT_CHECK([grep "harmonic_angle:.*particle_type1=1,.*particle_type2=8,.*particle_type3=1,.*spring_constant=0.10.*,.*equilibrium_distance=-0.27.*;" stdout], 0, [ignore], [ignore])
     95AT_CHECK([grep "harmonic_angle:.*particle_type1=1,.*particle_type2=8,.*particle_type3=1,.*spring_constant=0.10.*,.*equilibrium_distance=-0.27.*;" angle.potentials], 0, [ignore], [ignore])
    6396
    6497AT_CLEANUP
     
    71104AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Potential/FitPotential/pre/$file $file], 0)
    72105AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
    73 AT_CHECK([../../molecuilder --parse-homologies $file --set-random-number-engine "lagged_fibonacci607" --random-number-engine-parameters "seed=1;" --set-random-number-distribution "uniform_real" --random-number-distribution-parameters "min=0;max=1;" --fit-potential --potential-type "torsion" --potential-charges 6 6 6 6 --fragment-charges 6 6 6 6 1 1 1 1 1 1 1 1 1 1 --set-threshold 2e-10], 0, [stdout], [ignore])
     106AT_CHECK([../../molecuilder \
     107        --parse-homologies $file \
     108        --set-random-number-engine "lagged_fibonacci607" \
     109                --random-number-engine-parameters "seed=1;" \
     110        --set-random-number-distribution "uniform_real" \
     111                --random-number-distribution-parameters "min=0;max=1;" \
     112        --fit-potential \
     113                --potential-type "torsion" \
     114                --potential-charges 6 6 6 6 \
     115                --fragment-charges 6 6 6 6 1 1 1 1 1 1 1 1 1 1 \
     116                --set-threshold 2e-10 \
     117        --save-potentials torsion.potentials], 0, [stdout], [ignore])
    74118# check that L_2 error is below 9e-12 ... just 2e-10 otherwise test takes tooo long
    75119AT_CHECK([grep "Best parameters with L2 error" stdout | awk '{if ($8 > 2e-10) exit 1}'], 0, [ignore], [ignore])
    76 AT_CHECK([grep "torsion:.*particle_type1=6,.*particle_type2=6,.*particle_type3=6,.*particle_type4=6,.*spring_constant=.*,.*equilibrium_distance=.*;" stdout], 0, [ignore], [ignore])
    77 #AT_CHECK([grep "torsion:.*particle_type1=6,.*particle_type2=6,.*particle_type3=6,.*particle_type4=6,.*spring_constant=0.001.*,.*equilibrium_distance=0.99.*;" stdout], 0, [ignore], [ignore])
     120AT_CHECK([grep "torsion:.*particle_type1=6,.*particle_type2=6,.*particle_type3=6,.*particle_type4=6,.*spring_constant=.*,.*equilibrium_distance=.*;" torsion.potentials], 0, [ignore], [ignore])
     121#AT_CHECK([grep "torsion:.*particle_type1=6,.*particle_type2=6,.*particle_type3=6,.*particle_type4=6,.*spring_constant=0.001.*,.*equilibrium_distance=0.99.*;" torsion.potentials], 0, [ignore], [ignore])
    78122
    79123AT_CLEANUP
     
    86130AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Potential/FitPotential/pre/$file $file], 0)
    87131AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
    88 AT_CHECK([../../molecuilder --parse-homologies $file --set-random-number-engine "lagged_fibonacci607" --random-number-engine-parameters "seed=1;" --set-random-number-distribution "uniform_real" --random-number-distribution-parameters "min=0;max=1;" --fit-potential --potential-type "improper" --potential-charges 1 7 1 1 --fragment-charges 7 1 1 1 --set-threshold 3e-4], 0, [stdout], [ignore])
     132AT_CHECK([../../molecuilder \
     133        --parse-homologies $file \
     134        --set-random-number-engine "lagged_fibonacci607" \
     135                --random-number-engine-parameters "seed=1;" \
     136        --set-random-number-distribution "uniform_real" \
     137                --random-number-distribution-parameters "min=0;max=1;" \
     138        --fit-potential \
     139                --potential-type "improper" \
     140                --potential-charges 1 7 1 1 \
     141                --fragment-charges 7 1 1 1 \
     142                --set-threshold 3e-4 \
     143        --save-potentials improper.potentials], 0, [stdout], [ignore])
    89144# check that L_2 error is below 3e-4
    90145AT_CHECK([grep "Best parameters with L2 error" stdout | awk '{if ($8 > 3e-4) exit 1}'], 0, [ignore], [ignore])
    91146# check parameters to printed precision
    92 AT_CHECK([grep "improper:.*particle_type1=1,.*particle_type2=7,.*particle_type3=1,.*particle_type4=1,.*spring_constant=.*,.*equilibrium_distance=.*;" stdout], 0, [ignore], [ignore])
    93 #AT_CHECK([grep "improper:.*particle_type1=1,.*particle_type2=7,.*particle_type3=1,.*particle_type4=1,.*spring_constant=1.02.*,.*equilibrium_distance=0.85.*;" stdout], 0, [ignore], [ignore])
     147AT_CHECK([grep "improper:.*particle_type1=1,.*particle_type2=7,.*particle_type3=1,.*particle_type4=1,.*spring_constant=.*,.*equilibrium_distance=.*;" improper.potentials], 0, [ignore], [ignore])
     148#AT_CHECK([grep "improper:.*particle_type1=1,.*particle_type2=7,.*particle_type3=1,.*particle_type4=1,.*spring_constant=1.02.*,.*equilibrium_distance=0.85.*;" improper.potentials], 0, [ignore], [ignore])
    94149
    95150AT_CLEANUP
     
    102157AT_CHECK([/bin/cp -f ${abs_top_srcdir}/tests/regression/Potential/FitPotential/pre/$file $file], 0)
    103158AT_CHECK([chmod u+w $file], 0, [ignore], [ignore])
    104 AT_CHECK([../../molecuilder --parse-homologies $file --set-random-number-engine "lagged_fibonacci607" --random-number-engine-parameters "seed=5;" --set-random-number-distribution "uniform_real" --random-number-distribution-parameters "min=0;max=1;" --fit-potential --potential-type "lennardjones" --potential-charges 18 18 --fragment-charges 18 18 --set-threshold 7e-9], 0, [stdout], [ignore])
     159AT_CHECK([../../molecuilder \
     160        --parse-homologies $file \
     161        --set-random-number-engine "lagged_fibonacci607" \
     162                --random-number-engine-parameters "seed=5;" \
     163        --set-random-number-distribution "uniform_real" \
     164                --random-number-distribution-parameters "min=0;max=1;" \
     165        --fit-potential \
     166                --potential-type "lennardjones" \
     167                --potential-charges 18 18 \
     168                --fragment-charges 18 18 \
     169                --set-threshold 7e-9 \
     170        --save-potentials lj.potentials], 0, [stdout], [ignore])
    105171# check that L_2 error is below 7e-11 ... just 7e-9 otherwise test takes too long
    106172AT_CHECK([grep "Best parameters with L2 error" stdout | awk '{if ($8 > 7e-9) exit 1}'], 0, [ignore], [ignore])
    107173# check parameters to printed precision
    108 AT_CHECK([grep "lennardjones:.*particle_type1=18,.*particle_type2=18,.*epsilon=.*,.*sigma=.*;" stdout], 0, [ignore], [ignore])
    109 #AT_CHECK([grep "lennardjones:.*particle_type1=18,.*particle_type2=18,.*epsilon=1.*e-05,.*sigma=8.2.*;" stdout], 0, [ignore], [ignore])
     174AT_CHECK([grep "lennardjones:.*particle_type1=18,.*particle_type2=18,.*epsilon=.*,.*sigma=.*;" lj.potentials], 0, [ignore], [ignore])
     175#AT_CHECK([grep "lennardjones:.*particle_type1=18,.*particle_type2=18,.*epsilon=1.*e-05,.*sigma=8.2.*;" lj.potentials], 0, [ignore], [ignore])
    110176
    111177AT_CLEANUP
Note: See TracChangeset for help on using the changeset viewer.