+#endif
+
+/**
+ * Checks whether one ModelAction can reach another.
+ * @param from The ModelAction from which to begin exploration
+ * @param to The ModelAction to reach
+ * @return True, @a from can reach @a to; otherwise, false
+ */
+bool CycleGraph::checkReachable(const ModelAction *from, const ModelAction *to) const
+{
+ CycleNode *fromnode = actionToNode.get(from);
+ CycleNode *tonode = actionToNode.get(to);
+
+ if (!fromnode || !tonode)
+ return false;
+
+ return checkReachable(fromnode, tonode);
+}
+
+/**
+ * Checks whether one CycleNode can reach another.
+ * @param from The CycleNode from which to begin exploration
+ * @param to The CycleNode to reach
+ * @return True, @a from can reach @a to; otherwise, false
+ */
+bool CycleGraph::checkReachable(CycleNode *from, CycleNode *to) const
+{
+ std::vector< CycleNode *, ModelAlloc<CycleNode *> > queue;
+ discovered->reset();
+
+ queue.push_back(from);
+ discovered->put(from, from);
+ while (!queue.empty()) {
+ CycleNode *node = queue.back();
+ queue.pop_back();
+ if (node == to)
+ return true;