#include "action.h"
+#include <cstdlib>
#include <iostream>
using namespace std;
using namespace __gnu_cxx;
_name = action._name;
_preconditions = action._preconditions;
_effects = action._effects;
+ _executable = action._executable;
}
const Literals& Action::effects(int value) const{
}
int Action::execute() const{
- cout << "Executing: " << _executable << endl;
- return 0;
+ cout << "Executing: " << _name << endl;
+ return system(_executable.c_str());
}
const string& Action::name() const{
#dasdssad
eth0
# no preconditions
-"ifconfig up eth0"
+true #"ifconfig up eth0"
0: NET # kommentar
#include "node.h"
#include <algorithm>
+#include <iostream>
using namespace std;
Node::Node(const Action& action){
}
void Node::execute(const Literals& effects){
+ cerr << "Executing: " << _action.name() << endl;
for (Literals::const_iterator effect = effects.begin(); effect != effects.end(); ++effect){
+ cerr << "Satisfied effect: " << *effect << endl;
_preconditions.erase(_preconditions.find(*effect));
}
+ cerr << "Number of preconditions left: " << _preconditions.size() << endl;
+ if(_executed)
+ cerr << "Already executed" << endl;
if ((_preconditions.size() != 0) || _executed)
return;
- if (_preconditions.size() != 0){
- for (Preconditions::iterator precond = _preconditions.begin(); precond != _preconditions.end(); ++precond){
- if (precond->second)
- return;
- }
- }
-
_executed = true;
int value = _action.execute();
_effects = _action.effects(value);
+ cerr << "Got returnvalue: " << value << ", number of effects: " << _effects.size() << endl;
+
for(vector<Node*>::iterator child = _children.begin(); child != _children.end(); ++child){
- (*child)->execute(effects);
+ (*child)->execute(_effects);
}
}
//---------------------------------------------
// Debug test print :
- cout << "id: " << *$1 << endl;
+ cerr << "id: " << *$1 << endl;
// Precondition flags:
- cout << "a: " << (*$2)["a"] << endl;
- cout << "b: " << (*$2)["b"] << endl;
- cout << "c: " << (*$2)["c"] << endl;
- cout << "d: " << (*$2)["d"] << endl;
- cout << "e: " << (*$2)["e"] << endl;
+ cerr << "a: " << (*$2)["a"] << endl;
+ cerr << "b: " << (*$2)["b"] << endl;
+ cerr << "c: " << (*$2)["c"] << endl;
+ cerr << "d: " << (*$2)["d"] << endl;
+ cerr << "e: " << (*$2)["e"] << endl;
- cout << "exe: " << *$4 << endl;
+ cerr << "exe: " << *$4 << endl;
// Print number of effects
- cout << "1: " << (*$5)[1].size() << endl;
- cout << "99: " << (*$5)[99].size() << endl;
- cout << "88: " << (*$5)[88].size() << endl;
+ cerr << "0: " << (*$5)[0].size() << endl;
+ cerr << "99: " << (*$5)[99].size() << endl;
+ cerr << "88: " << (*$5)[88].size() << endl;
- cout << endl;
+ cerr << endl;
//----------------------------------------------
}
;
main (int argc, char** argv)
{
- if (argc!=4)
+ if (argc < 3)
{
- cout << "Syntax: " << argv[0] <<
+ cerr << "Syntax: " << argv[0] <<
" <file> <runlevel> \"init state\"" << endl;
return 1;
}
+ Literals init = argc >= 4 ? stringToVector(argv[3]) : Literals();
ifstream file(argv[1]);
if (!file)
{
yyparse();
- cout << (*runlevels)[2].size() << endl;
- cout << (*runlevels)[3].size() << endl;
- cout << (*runlevels)[4].size() << endl;
- cout << (*runlevels)[5].size() << endl;
+ cerr << (*runlevels)[2].size() << endl;
+ cerr << (*runlevels)[3].size() << endl;
+ cerr << (*runlevels)[4].size() << endl;
+ cerr << (*runlevels)[5].size() << endl;
- Planner p(*actions, stringToVector(argv[3]), (*runlevels)[atoi(argv[2])]);
+ Planner p(*actions, init, (*runlevels)[atoi(argv[2])]);
p.execute();
}
_actions[*effect] = *action;
}
}
- cout << "Number of actions: " << _actions.size() << endl;
+ cerr << "Number of actions: " << _actions.size() << endl;
makePlan(_finish);
}
Planner::~Planner(){
- for (hash_map<string,Node*>::iterator node = _addedNodes.begin(); node != _addedNodes.end(); ++node){
- cerr << "Deleting node " << node->second->action().name() << endl;
- delete node->second;
+ for (vector<Node*>::iterator node = _addedNodes.begin(); node != _addedNodes.end(); ++node){
+ cerr << "Deleting node " << (*node)->action().name() << endl;
+ delete *node;
}
}
}else{
for (Preconditions::const_iterator precond = preconds.begin(); precond != preconds.end(); ++precond){
cerr << "Looking for: '" << precond->first << "'" << endl;
- hash_map<string,Node*>::iterator addedNode = _addedNodes.find(precond->first);
- if(addedNode != _addedNodes.end()){
+ hash_map<string,Node*>::iterator addedNode = _addedEffects.find(precond->first);
+ if(addedNode != _addedEffects.end()){
cerr << "Using already added node" << endl;
addedNode->second->addChild(node);
}else {
cerr << "Adding node for action: " << node->action().name() << endl;
const Literals& effects = node->action().effects(0);
cerr << "Number of effects: " << effects.size() << endl;
+ _addedNodes.push_back(node);
for (Literals::const_iterator effect = effects.begin(); effect != effects.end(); ++effect){
- cout << "Adding node for effect: " << *effect << endl;
- _addedNodes[*effect] = node;
+ cerr << "Adding node for effect: " << *effect << endl;
+ _addedEffects[*effect] = node;
}
}
Node* _start;
Node* _finish;
- __gnu_cxx::hash_map<std::string,Node*> _addedNodes;
+ __gnu_cxx::hash_map<std::string,Node*> _addedEffects;
__gnu_cxx::hash_map<std::string,Action> _actions;
Literals _init;
Literals _goal;
+ std::vector<Node*> _addedNodes;
};
#endif