| 
					
				 | 
			
			
				@@ -25,87 +25,121 @@ nodelogs.sort(key=lambda filename : int(filename[1:-4])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # Pass 1: For each sender and receiver, make a list of each message 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # queued from that sender to receiver, noting its queue start time, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-# queue end time, size, and type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# queue end time, size, and type.  Also gather all timestamp labels for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# each node 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 queued_messages = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+labels = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 min_ts = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+max_ts = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 for nodelog in nodelogs: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     node = nodelog[:-4] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    labels[node] = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     with open(nodelog) as logf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         queueing = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for logline in logf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             logline = logline.rstrip() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if "RTE" in logline: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if "queueing" in logline: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    matches = re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        r'(\d+\.\d+): RTE queueing (\d+) bytes to (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        logline) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    [ts, size, recv] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(recv not in queueing) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    queueing[recv] = \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 'queue_start': tsf, 'size': size } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if min_ts is None or min_ts > tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        min_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if "queued" in logline: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    matches = re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        r'(\d+\.\d+): RTE queued (\d+) bytes to (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        logline) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    [ts, size, recv] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(recv in queueing) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(queueing[recv]['size'] == size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (node, recv) not in queued_messages: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        queued_messages[(node, recv)] = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    msg = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        'queue_start': queueing[recv]['queue_start'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        'queue_end': float(ts), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        'size': size, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        'type': 'RTE', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    queued_messages[(node, recv)].append(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    del queueing[recv] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): RTE queueing (\d+) bytes to (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, size, recv] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(recv not in queueing) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                queueing[recv] = \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 'queue_start': tsf, 'size': size } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if min_ts is None or min_ts > tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    min_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            elif matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): RTE queued (\d+) bytes to (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, size, recv] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(recv in queueing) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(queueing[recv]['size'] == size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (node, recv) not in queued_messages: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    queued_messages[(node, recv)] = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msg = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'queue_start': queueing[recv]['queue_start'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'queue_end': float(ts), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'size': size, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'type': 'RTE', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                queued_messages[(node, recv)].append(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                del queueing[recv] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            elif matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): Epoch \d+ (start|complete)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, typ] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if typ == 'start': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    typ = 'S' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                elif typ == 'complete': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    typ = 'F' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                labels[node].append((tsf, typ)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if max_ts is None or max_ts < tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    max_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            elif matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): Round (.*) complete', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, rnd] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if rnd == '11': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rnd = 'A' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                elif rnd == '12': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rnd = 'B' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                elif rnd == '13': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    rnd = 'C' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                labels[node].append((tsf, rnd)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if max_ts is None or max_ts < tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    max_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            elif matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): (Begin|End) Waksman networks precompute', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, typ] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if typ == 'Begin': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    typ = 'P' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                elif typ == 'End': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    typ = 'W' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                labels[node].append((tsf, typ)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if max_ts is None or max_ts < tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    max_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # Pass 2: For each sender and receiver, note the receive start time and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # receive end time for each message in the queued_messages list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 messages = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-max_ts = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 for nodelog in nodelogs: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     node = nodelog[:-4] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     with open(nodelog) as logf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         receiving = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for logline in logf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             logline = logline.rstrip() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if "RTE" in logline: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if "receiving" in logline: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    matches = re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        r'(\d+\.\d+): RTE receiving (\d+) bytes from (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        logline) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    [ts, size, snd] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(snd not in receiving) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    receiving[snd] = \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 'recv_start': float(ts), 'size': size } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if "received" in logline: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    matches = re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        r'(\d+\.\d+): RTE received (\d+) bytes from (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        logline) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    [ts, size, snd] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(snd in receiving) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(receiving[snd]['size'] == size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    assert(queued_messages[(snd, node)][0]['size'] == size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (snd, node) not in messages: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        messages[(snd, node)] = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    msg = queued_messages[(snd, node)].pop(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    msg['recv_start'] = receiving[snd]['recv_start'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    msg['recv_end'] = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if max_ts is None or max_ts < tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        max_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    messages[(snd, node)].append(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    del receiving[snd] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): RTE receiving (\d+) bytes from (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, size, snd] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(snd not in receiving) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                receiving[snd] = \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 'recv_start': float(ts), 'size': size } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            elif matches := re.match( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    r'(\d+\.\d+): RTE received (\d+) bytes from (\S+)', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    logline): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [ts, size, snd] = matches.groups() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(snd in receiving) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(receiving[snd]['size'] == size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                assert(queued_messages[(snd, node)][0]['size'] == size) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tsf = float(ts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (snd, node) not in messages: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    messages[(snd, node)] = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msg = queued_messages[(snd, node)].pop(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msg['recv_start'] = receiving[snd]['recv_start'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msg['recv_end'] = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if max_ts is None or max_ts < tsf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    max_ts = tsf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                messages[(snd, node)].append(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                del receiving[snd] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # Write a latex file that draws the messages 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -115,10 +149,14 @@ timescale = 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # Nodescale (cm between nodes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 nodescale = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Seconds between time label ticks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+time_tick = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 with open("trace.tex", "w") as tf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(r'''\documentclass{article} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 \usepackage[paperwidth=%fcm,paperheight=%fcm,margin=1cm]{geometry} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 \usepackage{tikz} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\usepackage{times} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 \setlength\parindent{0pt} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 \pagestyle{empty} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 \begin{document} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -127,19 +165,31 @@ with open("trace.tex", "w") as tf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     nodenum = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     nodepos = {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    print(r'''\draw[thick] (0,0) -- ++(%lf,0);''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ((max_ts-min_ts)*timescale), file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ts=0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while ts<(max_ts-min_ts): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(r'''\draw [thick] (%lf,.1) node [anchor=south] { %s } -- ++(0,-.1);''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (ts*timescale, str(ts)), file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ts+=time_tick 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for nodelog in nodelogs: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         node = nodelog[:-4] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         nodenum += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         nodepos[node] = -nodenum * nodescale 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        print(r'''\node [anchor=east] at (0,%f) { %s }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-\draw[thick] (0,%f) -- ++(%f,0);''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(r'''\node [anchor=east] at (0,%lf) { %s }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+\draw[thick] (0,%lf) -- ++(%lf,0);''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             (nodepos[node], node, nodepos[node], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             (max_ts-min_ts)*timescale), file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     for (snd,recv) in messages: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for msg in messages[(snd,recv)]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            print(msg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            print(r'''\fill [fill=%s,fill opacity=.2] (%f,%f) -- (%f,%f) -- (%f,%f) -- (%f,%f) -- cycle;''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(r'''%% %s %s %s %lf %lf %lf %lf''' % (snd, recv, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msg['size'], msg['queue_start'], msg['queue_end'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                msg['recv_start'], msg['recv_end']), file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(r'''\fill [fill=%s,fill opacity=.2] (%lf,%lf) -- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (%lf,%lf) -- (%lf,%lf) -- (%lf,%lf) -- cycle;''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ('black', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 (msg['queue_start']-min_ts)*timescale, nodepos[snd], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 (msg['queue_end']-min_ts)*timescale, nodepos[snd], 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -147,6 +197,13 @@ with open("trace.tex", "w") as tf: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 (msg['recv_start']-min_ts)*timescale, nodepos[recv]), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for node in labels: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (ts,label) in labels[node]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(r'''%% %lf''' % ts, file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(r'''\draw [thick] (%lf,%lf) node [anchor=south] { %s } -- ++(0,-.1);''' % 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ((ts-min_ts)*timescale, nodepos[node]+.1, label), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     print(r'''\end{tikzpicture} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 \end{document}''', file=tf) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |