/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2013 Frederik Heber. All rights reserved. * * * This file is part of MoleCuilder. * * MoleCuilder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * MoleCuilder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MoleCuilder. If not, see . */ /* * CompoundPotentialUnitTest.cpp * * Created on: May 08, 2013 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif using namespace std; #include #include #include #include "CompoundPotentialUnitTest.hpp" #include #include "CodePatterns/Assert.hpp" #include "FunctionApproximation/FunctionArgument.hpp" #include "Potentials/CompoundPotential.hpp" #include "Potentials/helpers.hpp" #include "Potentials/PotentialFactory.hpp" #include "Potentials/PotentialRegistry.hpp" #include "Potentials/Specifics/ConstantPotential.hpp" #include "Potentials/Specifics/PairPotential_Morse.hpp" using namespace boost::assign; #ifdef HAVE_TESTRUNNER #include "UnitTestMain.hpp" #endif /*HAVE_TESTRUNNER*/ /********************************************** Test classes **************************************/ // Registers the fixture into the 'registry' CPPUNIT_TEST_SUITE_REGISTRATION( CompoundPotentialTest ); void CompoundPotentialTest::setUp() { // failing asserts should be thrown ASSERT_DO(Assert::Throw); // register MorsePotential with registry { PairPotential_Morse::ParticleTypes_t types = boost::assign::list_of (0)(1) ; EmpiricalPotential *morse = PotentialFactory::getInstance().createInstance( std::string("morse"), types); PotentialRegistry::getInstance().registerInstance(morse); morse = NULL; } // register ConstantPotential with registry { ConstantPotential::ParticleTypes_t types; EmpiricalPotential *constant = PotentialFactory::getInstance().createInstance( std::string("constant"), types); PotentialRegistry::getInstance().registerInstance(constant); constant = NULL; } // create graph { // add nodes nodes += std::make_pair(FragmentNode(0,1),1), std::make_pair(FragmentNode(1,1),1); // add edges edges += std::make_pair(FragmentEdge(0,1),1); // construct graph graph = new HomologyGraph(nodes, edges); } // data is taken from gnuplot via set table "morse.dat" with // g(x)=D*(1- exp(-a*(x-c)))**2+d a = 0.897888; c = 2.92953; d = -78.9883; D = 0.196289; input += 1.89012, 2.17632, 2.46253, 2.74873, 3.03493, 3.32114, 3.60734, 3.89354, 4.17974, 4.46595; output += -78.5211, -78.8049, -78.935, -78.9822, -78.9867, -78.971, -78.9475, -78.9225, -78.899, -78.8784; CPPUNIT_ASSERT_EQUAL( input.size(), output.size() ); } void CompoundPotentialTest::tearDown() { delete graph; PotentialFactory::purgeInstance(); PotentialRegistry::getInstance().cleanup(); PotentialRegistry::purgeInstance(); } /** UnitTest for operator() */ void CompoundPotentialTest::operatorTest() { CompoundPotential compound(*graph); CompoundPotential::parameters_t params; params += d,a,c,D; compound.setParameters(params); for (size_t index = 0; index < input.size(); ++index) { argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), input[index]); const double result = compound( FunctionModel::arguments_t(1,arg) )[0]; CPPUNIT_ASSERT( Helpers::isEqual( output[index], result, 1.e-4/std::numeric_limits::epsilon() // only compare four digits ) ); } } /** UnitTest for derivative() */ //void CompoundPotentialTest::derivativeTest() //{ // CompoundPotential compound(*graph); // CompoundPotential::parameters_t params; // params += d,a,c,D; // compound.setParameters(params); // argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), c); // const double result = compound.derivative(FunctionModel::arguments_t(1,arg))[0] // CPPUNIT_ASSERT( // Helpers::isEqual( // 0., // result, // 1.e+6 // ) // ); //} /** UnitTest for parameter_derivative() */ void CompoundPotentialTest::parameter_derivativeTest() { CompoundPotential compound(*graph); CompoundPotential::parameters_t params; params += d,a,c,D; compound.setParameters(params); argument_t arg(argument_t::indices_t(0,1), argument_t::types_t(0,1), c); { const double result = compound.parameter_derivative( FunctionModel::arguments_t(1,arg), 0)[0]; CPPUNIT_ASSERT( Helpers::isEqual( 1., result, 1.e+6 ) ); } { const double result = compound.parameter_derivative( FunctionModel::arguments_t(1,arg), 1)[0]; CPPUNIT_ASSERT( Helpers::isEqual( 0., result, 1.e+6 ) ); } { const double result = compound.parameter_derivative( FunctionModel::arguments_t(1,arg), 2)[0]; CPPUNIT_ASSERT( Helpers::isEqual( 0., result, 1.e+6 ) ); } { const double result = compound.parameter_derivative( FunctionModel::arguments_t(1,arg), 3)[0]; CPPUNIT_ASSERT( Helpers::isEqual( 0., result, 1.e+6 ) ); } }