digraph "tasks" {
nodesep=0.3;
node [fillcolor="transparent", width=1.0, height=0.7];
//node [fillcolor="transparent", height=0.7];
newrank=true;
compound=true;
splines=false;

//{rank=same;
initial [shape=note, label="initial\nparameters"];
result [shape=note, label="optimized\nparameters"];
data [shape=note, label="experimental\ndata"];
//}

subgraph cluster_model {
shape=rect;
rank=same;
label="model handler";
create_model [label="generate\nmodel parameters"];
evaluate_model [label="evaluate\nmodel"];
}
custom_modf [label="modulation\nfunction", shape=cds];
{rank=same; create_model; evaluate_model; custom_modf;}
custom_modf -> evaluate_model [lhead=cluster_model];
initial -> create_model;
data -> evaluate_model;
result -> evaluate_model [dir=back];
create_model -> result [dir=back];


subgraph cluster_scan {
label="scan handler";
rank=same;
create_scan [label="define\nscan\ntasks"];
combine_scan [label="gather\nscan\nresults"];
}
custom_scan [label="scan\nconfiguration", shape=note];
{rank=same; custom_scan; create_scan; combine_scan;}
custom_scan -> create_scan [lhead=cluster_scan];

subgraph cluster_domain {
label="domain handler";
rank=same;
create_model_space [label="define\ndomain\ntasks"];
combine_domain  [label="gather\ndomain\nresults"];
}
custom_domain [label="domain\ndefinition", shape=cds];
{rank=same; create_model_space; combine_domain; custom_domain;}
custom_domain -> combine_domain [lhead=cluster_domain];

subgraph cluster_emitter {
label="emitter handler";
rank=same;
create_emitter [label="define\nemitter\ntasks"];
combine_emitter [label="gather\nemitter\nresults"];
}
custom_emitter [label="emitter\nconfiguration", shape=cds];
{rank=same; custom_emitter; create_emitter; combine_emitter;}
custom_emitter -> combine_emitter [lhead=cluster_emitter];

subgraph cluster_region {
label="region handler";
rank=same;
create_region [label="define\nregion\ntasks"];
combine_region [label="gather\nregion\nresults"];
}
custom_region [label="scan\nconfiguration", shape=note];
{rank=same; custom_region; create_region; combine_region;}
custom_region -> create_region [lhead=cluster_region];


subgraph cluster_edac {
    label="parallel computing";
   	edac [label=EDAC, peripheries=5];
}
create_cluster [label="cluster\ngenerator", shape=cds];
{rank=same; create_cluster; edac;}
create_cluster -> edac;

create_model -> create_scan [label="level 1 tasks"];
evaluate_model -> combine_scan [label="level 1 results", dir=back];

create_scan -> create_model_space [label="level 2 tasks"];
combine_scan -> combine_domain [label="level 2 results", dir=back];

create_model_space -> create_emitter [label="level 3 tasks"];
combine_domain -> combine_emitter [label="level 3 results", dir=back];

create_emitter -> create_region [label="level 4 tasks"];
combine_emitter -> combine_region [label="level 4 results", dir=back];

create_region -> edac [label="level 5 tasks"];
combine_region -> edac [label="level 5 results", dir=back];

}
