public void forward(ActionNode node) {

    // find the max
    double m = Double.NEGATIVE_INFINITY;
    for (BasicEdge edge : node.getBackConnections()) {
      double d =
          ((ActionNode) edge.getFrom()).getEarliestStartTime()
              + ((ActionNode) edge.getFrom()).getDuration();
      m = Math.max(d, m);
    }
    node.setEarliestStartTime(m);

    // handle other nodes
    for (BasicEdge edge : node.getConnections()) {
      forward((ActionNode) edge.getTo());
    }
  }