#define __node_h__
#include <vector>
+#include <utility>
#include "action.h"
+/**
+ * A node in the plan graph, corresponds to a single action.
+ */
class Node {
public:
- Node(Action action);
+ /**
+ * Creates a node for the given action.
+ */
+ Node(const Action* action);
+
+ /**
+ * Creates an empty, non-functional, node.
+ */
+ Node();
+
+ /**
+ * Creates a copy of the given node.
+ */
+ Node(const Node& node);
+ virtual ~Node(){}
+
+ /**
+ * Add a child node, which will be executed after this node.
+ */
void addChild(Node* node);
- Action action();
+
+ /**
+ * Returns the action this node corresponds to.
+ */
+ const Action* action() const;
+
+ /**
+ * Execute this node, and hence the corresponding action.
+ * Sets the effects achieved.
+ *
+ * If _executed is true or _preconditions.size() > 0 this method will
+ * just return.
+ */
void execute();
+ /**
+ * Checks if this node has been executed or not.
+ */
+ bool executed() const;
+
+ /**
+ * Returns the effects that was achieved from execution.
+ */
+ const Literals& effects() const;
+
+ /**
+ * Satisfy a single condition.
+ */
+ bool satisfyCondition(std::string effect);
+
+ /**
+ * Satisfies a list of conditions.
+ */
+ bool satisfyConditions(const Literals& effects);
+
+ /**
+ * Returns all the children to this node.
+ */
+ const std::vector<Node*>& children() const;
+
+ /**
+ * Returns the unsatisfied preconditions.
+ */
+ const Preconditions& preconditions() const;
+
protected:
- Action _action;
+ //! The action this node corresponds to.
+ const Action* _action;
+ //! The list of children to this node.
std::vector<Node*> _children;
+ //! The, so far, unsatisfied preconditions.
+ Preconditions _preconditions;
+ //! Will be true if this node has been executed.
+ bool _executed;
+ //! The effects which were achieved by the execution.
+ Literals _effects;
+};
+
+/**
+ * Class which is used as the start node in the plan graph.
+ */
+class StartNode :public Node {
+ public:
+ StartNode(const Literals& init);
+ ~StartNode(){delete _action;}
+};
+
+/**
+ * Class which is used as the end node in the plan graph.
+ */
+class EndNode :public Node {
+ public:
+ EndNode(const Literals& goal);
+ ~EndNode(){delete _action;}
};
#endif