X-Git-Url: https://ruin.nu/git/?a=blobdiff_plain;f=planner.h;h=c6f23b2334895bb91a09562ba465017be18a74ff;hb=8282bdb08791f2631a9d51e75b988077d903f3d1;hp=4846fd9166a908b0a0d54b7b592455d24cfce0b5;hpb=50f9b29fed8c97deac825a31c35bb7759abca04f;p=popboot.git diff --git a/planner.h b/planner.h index 4846fd9..c6f23b2 100644 --- a/planner.h +++ b/planner.h @@ -1,12 +1,108 @@ #ifndef __PLANNER_H__ #define __PLANNER_H__ -#include +#include +#include +#include +#include +#include +#include "action.h" + +class Node; + +/** + * This class creates, holds and executes a plan. + */ 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 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(); + + /** + * Iterates through the children of the input node and satisfies all + * preconditions possible with this node. The children will be executed + * if all preconditions have been satisfied. + */ + int executeChildren(Node* node); + + /** + * Addes the remaining actions to the actions map, creates new start and + * finish nodes and runs makePlan. + */ + void replan(); + + /** + * Deletes all nodes, updates _init and _goal, and clears the internal maps and vector. + */ + int cleanupExecution(); + + //! Semaphore which is used to signal if a new node has been executed and added to _executedNodes. + sem_t _nodes; + //! Mutex for access to _executedNodes. + sem_t _list; + //! Holds the nodes which have been executed, but the children haven't been taken care of yet. + std::queue _executedNodes; + + //! The start node in the plan graph. + Node* _start; + //! The end node in the plan graph. + Node* _finish; + //! Map from all the effects which can be achieved with the already added nodes. + __gnu_cxx::hash_map _addedEffects; + //! Map with all effects available and their corresponding actions. + __gnu_cxx::hash_map _actionEffects; + //! The initial state. + Literals _init; + //! The goal state + Literals _goal; + //! All the nodes added to the current plan. + std::vector _addedNodes; + //! All the non-executed actions available in the current plan. + std::vector _actions; }; #endif