code: @SuppressWarnings("rawtypes")
      private AbstractNode combineIDD(ExternalNode3 n1, InternalNode<?> n2) throws MIDDException {
  
  
          List<Interval> intervals = n2.getIntervals();
          List<Interval<?>> complementIntervals = IntervalUtils.complement(intervals);
  
          // clone new node from n2
  
          InternalNodeState newINState = combineInternalNodeStates(n2.getState(), n1);
  
          InternalNode<?> n = NodeUtils.createInternalNode(n2.getID(), newINState, n2.getType());
  
          if (complementIntervals.size() > 0) {
              AbstractEdge<?> edge = EdgeUtils.createEdge(complementIntervals, n2.getType());
              if (edge.getIntervals().size() == 0) {
                  throw new RuntimeException("Empty edge");
              }
              n.addChild(edge, n1);
          }
  
          for (AbstractEdge<?> e : n2.getEdges()) {
              AbstractNode child = combine(n1, e.getSubDiagram());
              n.addChild(EdgeUtils.cloneEdge(e), child);
          }
          return n;
      }
docs: Combine two MIDDs: an external node with an internal node.
  <p/>
  Algorithm: set of intervals: n2.intervals U (*\{n2.intervals}) - with i = *\{n2.intervals}, n.children[0] = n1,
  n.intervals[0] = *\{n1.intervals} - with (i : n2.intervals), n.children[i] = n2.children[i], n.intervals[i] =
  n1.interval[i]
  <p/>
  2012.11.13 - Modified: predicate of the internal node n1 to only external node n2 is 'null-edge' -
  n.intervals[i+1] = Null; n.children[i+1] = n2;
  <p/>
  The output MIDD is the DAG rooted at n, has |n2.intervals| + 1 children
  
  @param n1
  @param n2
  @return