Source code for icarus.results.visualize

"""Functions for visualizing results on graphs of topologies"""
from __future__ import division
import os

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import networkx as nx


__all__ = [
       'draw_stack_deployment',
       'draw_network_load',
          ]


# Colormap for node stacks
COLORMAP = {'source':    'blue',
            'receiver':  'green',
            'router':    'white',
            'cache':     'red',
            }


def stack_map(topology):
    """Return dict mapping node ID to stack type

    Parameters
    ----------
    topology : Topology
        The topology

    Returns
    -------
    stack_map : dict
        Dict mapping node to stack. Options are:
        source | receiver | router | cache
    """
    stack = {}
    for v, (name, props) in topology.stacks().items():
        if name == 'router':
            cache = False
            if 'cache_size' in props and props['cache_size'] > 0:
                cache = True
            elif cache:
                name = 'cache'
            else:
                name = 'router'
        stack[v] = name
    return stack


[docs]def draw_stack_deployment(topology, filename, plotdir): """Draw a topology with different node colors according to stack Parameters ---------- topology : Topology The topology to draw plotdir : string The directory onto which draw plots filename : string The name of the image file to save """ stack = stack_map(topology) node_color = [COLORMAP[stack[v]] for v in topology.nodes_iter()] plt.figure() nx.draw_graphviz(topology, node_color=node_color, with_labels=False) plt.savefig(os.path.join(plotdir, filename), bbox_inches='tight')
[docs]def draw_network_load(topology, result, filename, plotdir): """Draw topology with node colors according to stack and node size and link color according to server/cache hits and link loads. Nodes are colored according to COLORMAP. Edge are colored on a blue-red scale where blue means min link load and red means max link load. Sources and caches have variable size proportional to their hit ratios. Parameters ---------- topology : Topology The topology to draw result : Tree The tree representing the specific experiment result from which metric are read plotdir : string The directory onto which draw plots filename : string The name of the image file to save """ stack = stack_map(topology) node_color = [COLORMAP[stack[v]] for v in topology.nodes_iter()] node_min = 50 node_max = 600 hits = result['CACHE_HIT_RATIO']['PER_NODE_CACHE_HIT_RATIO'].copy() hits.update(result['CACHE_HIT_RATIO']['PER_NODE_SERVER_HIT_RATIO']) hits = np.array([hits[v] if v in hits else 0 for v in topology.nodes_iter()]) min_hits = np.min(hits) max_hits = np.max(hits) hits = node_min + (node_max - node_min) * (hits - min_hits) / (max_hits - min_hits) link_load = result['LINK_LOAD']['PER_LINK_INTERNAL'].copy() link_load.update(result['LINK_LOAD']['PER_LINK_EXTERNAL']) link_load = [link_load[e] if e in link_load else 0 for e in topology.edges()] plt.figure() nx.draw_graphviz(topology, node_color=node_color, node_size=hits, width=2.0, edge_color=link_load, edge_cmap=mpl.colors.LinearSegmentedColormap.from_list('bluered', ['blue', 'red']), with_labels=False) plt.savefig(os.path.join(plotdir, filename), bbox_inches='tight')