digraph {
	#rankdir=LR;
	graph [ranksep="1"];
	newrank=true;

	subgraph cluster_resource {
		color="#ffeeee";
		style=filled;
		label="Resouce model";

		cluster -> {"node 0", "node 1"}

		"node 0" -> {"cpu 0.0", "cpu 0.1"}
		"node 1" -> {"cpu 1.0", "cpu 1.1"}
	}

	subgraph cluster_process {
		color="#eeffee";
		style=filled;
		label="Process model"

		genesis -> {"loom 0", "loom 1"}

		"loom 0" -> {"pid 0.0", "pid 0.1"}
		"loom 1" -> {"pid 1.0", "pid 1.1"}

		"pid 0.0" -> {"th 0.0.0", "th 0.0.1"}
		"pid 0.1" -> {"th 0.1.0", "th 0.1.1"}
	}

	subgraph cluster_task {
		color="#eeeeff";
		style=filled;
		label="Task model";

		workload -> { "app 0", "app 1"};

		"app 0" -> {"rank 0.0", "rank 0.1"};
		"app 1" -> {"rank 1.0", "rank 1.1"};

		"rank 0.0" -> {"task 0.0.0","task 0.0.1"};
		"rank 0.1" -> {"task 0.1.0", "task 0.1.1"};
	}

	{rank = same; workload; cluster; genesis;}
	{
		rank = same;
		"node 0"; "node 1"; "loom 0"; "loom 1";
	}
	{ rank=same; "app 0"; "app 1"; }
	{
		rank = same; "rank 0.0"; "pid 0.0";
	}
	{
		rank = same; "th 0.0.0"; "task 0.0.0";
		"cpu 0.0"; "cpu 0.1"; "cpu 1.0"; "cpu 1.1";
	}


	
	edge [style=dashed, constraint=false];
	"loom 0" -> "node 0" [color=blue, label="mapped to"];
	"rank 0.0" -> "pid 0.0" [color=blue, label="mapped to"];
	"task 0.0.0" -> "th 0.0.0" [color=red, label="runs at"];
	"th 0.0.0" -> "cpu 0.0" [color=red, label="runs at"];
}
