/*
 * ForceAnnealingAction.def
 *
 *  Created on: Aug 02, 2014
 *      Author: heber
 */

// all includes and forward declarations necessary for non-integral types below
#include <boost/filesystem/path.hpp>

#include <limits>

#include "Parameters/Validators/DummyValidator.hpp"
#include "Parameters/Validators/GenericValidators.hpp"
#include "Parameters/Validators/Ops_Validator.hpp"
#include "Parameters/Validators/RangeValidator.hpp"

// i.e. there is an integer with variable name Z that can be found in
// ValueStorage by the token "Z" -> first column: int, Z, "Z"
// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
#define paramtypes (boost::filesystem::path)(double)(unsigned int)(bool)(int)(double)(bool)
#define paramtokens ("forces-file")("deltat")("steps")("output-every-step")("max-distance")("damping-factor")("use-bondgraph")
#define paramdescriptions ("file containing")("basic step width to be used")("fixed number of optimization steps to be performed")("whether WorldTime should be increased and output written after every step, useful if optimization might hang")("maximum distance to which bond graph is taken into account")("damping factor for decreasing the shift with bond graph distance from the causing site")("whether annealing should take place focusing on atoms alone or on the bonds (faster)")
#define paramdefaults (PARAM_DEFAULT(""))(PARAM_DEFAULT(0.1))(NOPARAM_DEFAULT)(PARAM_DEFAULT("0"))(PARAM_DEFAULT(0))(PARAM_DEFAULT(0.5))(PARAM_DEFAULT(0))
#define paramreferences (forcesfile)(deltat)(steps)(DoOutput)(MaxDistance)(DampingFactor)(UseBondGraph)
#define paramvalids \
(DummyValidator< boost::filesystem::path >()) \
(RangeValidator< double >(std::numeric_limits<double>::min(), std::numeric_limits<double>::max())) \
(NotZeroValidator< unsigned int >()) \
(DummyValidator<bool>()) \
(DummyValidator< int >()) \
(RangeValidator< double >(0,1)) \
(DummyValidator<bool>())

#define statetypes (std::vector<AtomicInfo>)(std::vector<AtomicInfo>)
#define statereferences (UndoInfo)(RedoInfo)

// some defines for all the names, you may use ACTION, STATE and PARAMS
#define CATEGORY Molecule
#define MENUNAME "molecule"
#define MENUPOSITION 12
#define ACTIONNAME ForceAnnealing
#define TOKEN "force-annealing"

// finally the information stored in the ActionTrait specialization
#define DESCRIPTION "perform a single step optimizing the current forces acting on the atoms"
#undef SHORTFORM
