public void run(mxGraph graph,Object parent,HashMap<Object,Set<Object>> rootsAndChildren){
  double initialX=0;
  for (  Object r : rootsAndChildren.keySet()) {
    Set<Object> vertexSet=rootsAndChildren.get(r);
    for (    Object rc : vertexSet) {
      if (!graph.isSwimlane(rc)) {
        graph.updateCellSize(rc,true);
      }
    }
  }
  for (  Object r : rootsAndChildren.keySet()) {
    Set<Object> vertexSet=rootsAndChildren.get(r);
    ArrayList<Object> rootsList=new ArrayList<Object>();
    rootsList.add(r);
    model=new mxGraphHierarchyModel(this,vertexSet.toArray(),rootsList,parent,false,deterministic,layoutFromSinks);
    cycleStage(parent);
    layeringStage();
    crossingStage(parent);
    initialX=placementStage(initialX,parent);
  }
}

public void run ( mxGraph graph , Object parent , HashMap < Object , Set < Object > > rootsAndChildren ) { double initialX = 0 ; for ( Object r : rootsAndChildren . keySet ( ) ) { Set < Object > vertexSet = rootsAndChildren . get ( r ) ; for ( Object rc : vertexSet ) { if ( ! graph . isSwimlane ( rc ) ) { graph . updateCellSize ( rc , true ) ; } } } for ( Object r : rootsAndChildren . keySet ( ) ) { Set < Object > vertexSet = rootsAndChildren . get ( r ) ; ArrayList < Object > rootsList = new ArrayList < Object > ( ) ; rootsList . add ( r ) ; model = new mxGraphHierarchyModel ( this , vertexSet . toArray ( ) , rootsList , parent , false , deterministic , layoutFromSinks ) ; cycleStage ( parent ) ; layeringStage ( ) ; crossingStage ( parent ) ; initialX = placementStage ( initialX , parent ) ; } }
the api method used to exercise the layout upon the graph description and produce a separate description of the vertex position and edge routing changes made .
