source: src/Actions/MakroAction_impl_header.hpp@ a2a2f7

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
Last change on this file since a2a2f7 was 237f93, checked in by Frederik Heber <heber@…>, 11 years ago

FIX: MolecularDynamicsAction now prepares normally not inside performCall().

  • added protected ActionSequence::removeAction() and pass-thru in MakroAction.
  • added MakroAction::fillOwnDialog(): We did not cleanly implement the MakroAction's dialogs before. We need to populate queries from the sequeence of Actions and from the MakroAction itself (e.g. for loop count). For the latter, we need another new function for this.
  • MolecularDynamicsAction removes output action from sequence if not desired.
  • removed (another) fillAllDialog from MakroAction::performCall(). This has been the source of doubly occuring dialogs (and dialog becoming ever larger on multiple calls).
  • MolecularDynamicsAction::prepare() also just uses ActionRegistry whose ref is passed as parameter and does not (directly) access ActionQueue.
  • Property mode set to 100644
File size: 8.6 KB
Line 
1/*
2 * Action_impl_header.hpp
3 *
4 * Created on: Aug 25, 2010
5 * Author: heber
6 */
7
8// include config.h
9#ifdef HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include <boost/preprocessor/cat.hpp>
14#include <boost/preprocessor/comparison/equal.hpp>
15#include <boost/preprocessor/comparison/not_equal.hpp>
16#include <boost/preprocessor/control/expr_if.hpp>
17#include <boost/preprocessor/control/if.hpp>
18#include <boost/preprocessor/debug/assert.hpp>
19#include <boost/preprocessor/iteration/local.hpp>
20#include <boost/preprocessor/list/adt.hpp>
21#include <boost/preprocessor/punctuation/comma_if.hpp>
22#include <boost/preprocessor/punctuation/paren.hpp>
23#include <boost/preprocessor/repetition/repeat.hpp>
24#include <boost/preprocessor/seq/elem.hpp>
25#include <boost/preprocessor/seq/push_back.hpp>
26#include <boost/preprocessor/seq/seq.hpp>
27#include <boost/preprocessor/seq/size.hpp>
28#include <boost/preprocessor/seq/transform.hpp>
29
30#include <iostream>
31#include <typeinfo>
32
33#include "Actions/ActionSequence.hpp"
34#include "Actions/ActionTraits.hpp"
35
36#include "Parameters/Parameter.hpp"
37
38// some derived names: if CATEGORY is not given, we don't prefix with it
39#ifdef CATEGORY
40#define ACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
41#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
42#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
43#else
44#define ACTION BOOST_PP_CAT(ACTIONNAME, Action)
45#define COMMAND ACTIONNAME
46#define PARAMS BOOST_PP_CAT(ACTIONNAME, Parameters)
47#endif
48// check if no lists given
49#ifndef paramtypes
50#define MAXPARAMTYPES 0
51#else
52#define MAXPARAMTYPES BOOST_PP_SEQ_SIZE(paramtypes)
53#endif
54#ifndef paramdefaults
55#define MAXPARAMDEFAULTS 0
56// this is required for valid_print "else part"
57#define sequencer(z,n,data) \
58 BOOST_PP_SEQ_PUSH_BACK( data, NOPARAM_DEFAULT)
59#define paramdefaults BOOST_PP_REPEAT( MAXPARAMTYPES, sequencer, BOOST_PP_SEQ_NIL )
60#else
61#define MAXPARAMDEFAULTS BOOST_PP_SEQ_SIZE(paramdefaults)
62#endif
63#define PARAM_DEFAULT(x) \
64 (x, BOOST_PP_NIL)
65
66// check user has given name and category
67#ifndef ACTIONNAME
68ERROR: No "ACTIONNAME" defined in: __FILE__
69#endif
70
71// calculate numbers and check whether all have same size
72#ifdef paramtokens
73BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramtokens)),\
74 ERROR: There are not the same number of "paramtokens" and "paramtypes" in: __FILE__ \
75)
76#endif
77#ifdef paramreferences
78BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramreferences)),\
79 ERROR: There are not the same number of "paramtokens" and "paramreferences" in: __FILE__ \
80)
81#endif
82#ifdef paramdescriptions
83BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdescriptions)),\
84 ERROR: There are not the same number of "paramtokens" and "paramdescriptions" in: __FILE__ \
85)
86#endif
87
88// check for mandatory defines
89#ifndef DESCRIPTION
90BOOST_PP_ASSERT_MSG(0, \
91 "ERROR: Description is mandatory for Actions, here for ACTION " \
92)
93#endif
94
95// check if paramdefaults is given, otherwise fill list with NOPARAM_DEFAULT
96// this does not work: paramdefaults has to be completely defined before
97// being used within option_print (used as an array there and not as
98// some function call still to be expanded)
99//#define paramdefaults (NOPARAM_DEFAULT)
100//#define tempvalue(z,n,value)
101// BOOST_PP_CAT(value,(NOPARAM_DEFAULT))
102//BOOST_PP_REPEAT(tempvalue, MAXPARAMTYPES, paramdefaults)
103//#undef tempvalue
104//#else
105
106// if present, check if correct number of arguments
107#ifdef paramdefaults
108BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdefaults)),\
109 ERROR: There are not the same number of "paramtokens" and "paramdefaults" in: __FILE__ \
110)
111#endif
112
113// print a list of type ref followed by a separator, i.e. "Parameter<int> i;"
114#define type_print(z,n,TYPELIST, VARLIST, separator) \
115 Parameter < \
116 BOOST_PP_SEQ_ELEM(n, TYPELIST) \
117 > \
118 BOOST_PP_SEQ_ELEM(n, VARLIST) \
119 separator
120
121// print a list of type ref followed, i.e. "int i, double position"
122#define type_list(z,n,TYPELIST, VARLIST) \
123 BOOST_PP_COMMA_IF(n)\
124 BOOST_PP_SEQ_ELEM(n, TYPELIST) \
125 BOOST_PP_SEQ_ELEM(n, VARLIST)
126
127// prints Options.insert
128#define option_print(z,n,unused, unused2) \
129 tester = Options. insert (\
130 std::pair< std::string, OptionTrait *> ( \
131 BOOST_PP_SEQ_ELEM(n, paramtokens), \
132 new OptionTrait(\
133 BOOST_PP_SEQ_ELEM(n, paramtokens), \
134 &typeid( BOOST_PP_SEQ_ELEM(n, paramtypes) ), \
135 BOOST_PP_SEQ_ELEM(n, paramdescriptions) \
136 BOOST_PP_COMMA_IF( BOOST_PP_NOT( BOOST_PP_LIST_IS_NIL( BOOST_PP_SEQ_ELEM(n, paramdefaults) ) ) ) \
137 BOOST_PP_EXPR_IF( \
138 BOOST_PP_NOT( BOOST_PP_LIST_IS_NIL( BOOST_PP_SEQ_ELEM(n, paramdefaults) ) ), \
139 toString BOOST_PP_LPAREN() \
140 BOOST_PP_LIST_FIRST( BOOST_PP_SEQ_ELEM(n, paramdefaults) )) \
141 BOOST_PP_RPAREN() \
142 )\
143 )\
144 ); \
145 ASSERT(tester.second, "ActionTrait<ACTION>::ActionTrait<ACTION>() option token present twice!");
146
147namespace MoleCuilder {
148
149void COMMAND(
150#if defined paramtypes && defined paramreferences
151#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
152#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
153#include BOOST_PP_LOCAL_ITERATE()
154#endif
155 );
156
157class ACTION;
158
159template <>
160class ActionTraits<ACTION> : public ActionTrait {
161public:
162 ActionTraits() :
163#ifndef SHORTFORM
164 ActionTrait(OptionTrait(TOKEN, &typeid(void), DESCRIPTION, std::string()))
165#else
166 ActionTrait(OptionTrait(TOKEN, &typeid(void), DESCRIPTION, std::string(), SHORTFORM))
167#endif /* SHORTFORM */
168 {
169 // initialize remainder of action info
170#ifdef MENUNAME
171 MenuTitle = MENUNAME;
172#endif
173#ifdef MENUPOSITION
174 MenuPosition = MENUPOSITION;
175#endif
176
177 // initialize action's options
178 std::pair< ActionTrait::options_iterator, bool > tester;
179#ifdef paramtokens
180#define BOOST_PP_LOCAL_MACRO(n) option_print(~, n, ~, )
181#define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
182#include BOOST_PP_LOCAL_ITERATE()
183#endif
184 // associate action's short form also with option
185#ifdef SHORTFORM
186 if (Options.find(TOKEN) != Options.end())
187 Options[TOKEN]->setShortForm(std::string(SHORTFORM));
188#endif /* SHORTFORM */
189 //std::cout << "ActionTraits<" << BOOST_PP_STRINGIZE(ACTION) << ">::ActionTraits() on instance " << this << " with " << getName() << ", type " << getTypeName() << " and description " << getDescription() << std::endl;
190 }
191
192 virtual ~ActionTraits() {
193 //std::cout << "ActionTraits<" << BOOST_PP_STRINGIZE(ACTION) << ">::~ActionTraits() on instance " << this << " with name " << getName() << " called." << std::endl;
194 }
195};
196
197class ACTION : public MakroAction {
198 #if defined paramtypes && defined paramreferences
199 friend void COMMAND(
200 #define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
201 #define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
202 #include BOOST_PP_LOCAL_ITERATE()
203 );
204 # else
205 void COMMAND();
206 #endif
207
208public:
209 ACTION();
210 virtual ~ACTION();
211
212 // must be called after all primitive actions are present
213 void prepare(ActionRegistry &AR);
214 // must be called before alle primitive actions are removed
215 void unprepare(ActionRegistry &AR);
216
217 bool canUndo();
218 bool shouldUndo();
219
220 void outputAsCLI(std::ostream &ost) const;
221 void outputAsPython(std::ostream &ost, const std::string &prefix) const;
222
223 struct PARAMS : ActionParameters {
224 //!> constructor for class PARAMS, setting valid ranges
225 PARAMS();
226 //!> copy constructor for class PARAMS, setting valid ranges
227 PARAMS(const PARAMS &p);
228 #if defined paramtypes && defined paramreferences
229 #define BOOST_PP_LOCAL_MACRO(n) type_print(~, n, paramtypes, paramreferences, ;)
230 #define BOOST_PP_LOCAL_LIMITS (0, MAXPARAMTYPES-1)
231 #include BOOST_PP_LOCAL_ITERATE()
232 #endif
233 } params;
234
235protected:
236 virtual Dialog * fillOwnDialog(Dialog*);
237
238 void startTimer() const;
239 void endTimer() const;
240
241private:
242 //!> flag to check whether actions have been prepared
243 static bool isPrepared;
244 //!> sequence of actions for this macro action
245 static ActionSequence actions;
246
247private:
248 virtual ActionState::ptr performCall();
249 virtual ActionState::ptr performUndo(ActionState::ptr);
250 virtual ActionState::ptr performRedo(ActionState::ptr);
251};
252
253}
254
255#undef paramvalids
256#undef paramtypes
257#undef paramtokens
258#undef paramreferences
259#undef paramdescriptions
260#undef paramdefaults
261#undef MAXPARAMTYPES
262#undef MAXPARAMDEFAULTS
263#undef statetypes
264#undef statereferences
265#undef MAXSTATETYPES
266#undef PARAM_DEFAULT
267
268#undef option_print
269#undef sequencer
270#undef type_print
271#undef type_list
272
273#undef ACTION
274#undef COMMAND
275#undef COMMANDFULL
276#undef PARAMS
277
278#undef ACTIONNAME
279#undef CATEGORY
280#undef MENUNAME
281#undef MENUPOSITION
282#undef TOKEN
283
284#undef DESCRIPTION
285#undef SHORTFORM
Note: See TracBrowser for help on using the repository browser.