X-Git-Url: https://ruin.nu/git/?p=popboot.git;a=blobdiff_plain;f=planner.h;h=c6f23b2334895bb91a09562ba465017be18a74ff;hp=f00c61473382884c6c42bf427614278c627c851f;hb=HEAD;hpb=76a6e62c0a20bebba4c828f528f118a1f789b593 diff --git a/planner.h b/planner.h index f00c614..c6f23b2 100644 --- a/planner.h +++ b/planner.h @@ -3,29 +3,106 @@ #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: + /** + * 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