]> ruin.nu Git - popboot.git/blobdiff - planner.h
documentation
[popboot.git] / planner.h
index 4846fd9166a908b0a0d54b7b592455d24cfce0b5..fc49df9d5659e42646fa307e034c4c59b6ec58b4 100644 (file)
--- a/planner.h
+++ b/planner.h
@@ -1,12 +1,79 @@
 #ifndef __PLANNER_H__
 #define __PLANNER_H__
-#include <hash_map>
+
+#include <ext/hash_map>
+#include <vector>
+#include <queue>
+#include <pthread.h>
+#include <semaphore.h>
+#include "action.h"
+
+class Node;
 
 class Planner {
        public:
+               /**
+                * Creates a plan given the input actions, initial state and goal.
+                *
+                * @param actions A list of actions which will be used to reach the goal.
+                * @param init The initial state which the plan will start from.
+                * @param goal The goal state which the plan will try to reach.
+                */
+               Planner(std::vector<Action> actions, Literals init, Literals goal);
+
+               /**
+                * Deletes all the remaining nodes and actions.
+                */
+               ~Planner();
+
+               /**
+                * Executes the plan.
+                * Creates new threads for execution of each action.
+                *
+                * If any action fail in some way, this method will try to replan and
+                * recursively call itself.
+                */
+               void execute();
+
 
        protected:
-               Node start;
-               std::hash_map addedNodes;
+
+               /**
+                * This method does the actual planning. Given the input node it will
+                * try to find all preconditions and create links from parent nodes
+                * to this node and, if the precondition did not have a node associated
+                * with it, create a new and recursively call this method for the newly
+                * created node.
+                *
+                * @param node The node which this method will find parent nodes for.
+                */
+               void makePlan(Node* node);
+
+               /**
+                * Adds this node to the internal map and vector.
+                */
+               void addNode(Node* node);
+
+               /**
+                * This method goes through the executed nodes and then calls 
+                * executeChildren for these nodes.
+                */
+               void executePlan();
+               int executeChildren(Node* node);
+               void replan();
+               int cleanupExecution();
+
+               sem_t _nodes;
+               sem_t _list;
+               std::queue<Node*> _executedNodes;
+
+               Node* _start;
+               Node* _finish;
+               __gnu_cxx::hash_map<std::string,Node*> _addedEffects;
+               __gnu_cxx::hash_map<std::string,Action*> _actionEffects;
+               Literals _init;
+               Literals _goal;
+               std::vector<Node*> _addedNodes;
+               std::vector<Action*> _actions;
 };
 #endif