Added cap limits on graphs.
Surprisingly hard to understand what the cap limit should be.
This commit is contained in:
parent
1616a855f1
commit
bdd4e8925e
1 changed files with 31 additions and 7 deletions
|
@ -34,7 +34,7 @@ def plot_node_load_on(ax: plt.Axes,
|
||||||
write_fraction: Optional[Distribution] = None):
|
write_fraction: Optional[Distribution] = None):
|
||||||
_plot_node_load_on(ax,
|
_plot_node_load_on(ax,
|
||||||
strategy,
|
strategy,
|
||||||
nodes or list(strategy.qs.nodes()),
|
nodes or list(strategy.nodes()),
|
||||||
scale=1,
|
scale=1,
|
||||||
scale_by_node_capacity=True,
|
scale_by_node_capacity=True,
|
||||||
read_fraction=read_fraction,
|
read_fraction=read_fraction,
|
||||||
|
@ -61,7 +61,7 @@ def plot_node_utilization_on(ax: plt.Axes,
|
||||||
write_fraction: Optional[Distribution] = None):
|
write_fraction: Optional[Distribution] = None):
|
||||||
_plot_node_load_on(ax,
|
_plot_node_load_on(ax,
|
||||||
strategy,
|
strategy,
|
||||||
nodes or list(strategy.qs.nodes()),
|
nodes or list(strategy.nodes()),
|
||||||
scale=strategy.capacity(read_fraction, write_fraction),
|
scale=strategy.capacity(read_fraction, write_fraction),
|
||||||
scale_by_node_capacity=True,
|
scale_by_node_capacity=True,
|
||||||
read_fraction=read_fraction,
|
read_fraction=read_fraction,
|
||||||
|
@ -86,13 +86,28 @@ def plot_node_throughput_on(ax: plt.Axes,
|
||||||
nodes: Optional[List[Node[T]]] = None,
|
nodes: Optional[List[Node[T]]] = None,
|
||||||
read_fraction: Optional[Distribution] = None,
|
read_fraction: Optional[Distribution] = None,
|
||||||
write_fraction: Optional[Distribution] = None):
|
write_fraction: Optional[Distribution] = None):
|
||||||
|
nodes = nodes or list(strategy.nodes())
|
||||||
|
d = distribution.canonicalize_rw(read_fraction, write_fraction)
|
||||||
|
fr = sum(weight * fr for (fr, weight) in d.items())
|
||||||
|
fw = 1 - fr
|
||||||
|
node_limits = [
|
||||||
|
fr * strategy.x_read_probability[node.x] / node_load +
|
||||||
|
fw * strategy.x_write_probability[node.x] / node_load
|
||||||
|
for node in nodes
|
||||||
|
for node_load in [strategy.node_load(
|
||||||
|
node,
|
||||||
|
read_fraction=read_fraction,
|
||||||
|
write_fraction=write_fraction
|
||||||
|
)]
|
||||||
|
]
|
||||||
_plot_node_load_on(ax,
|
_plot_node_load_on(ax,
|
||||||
strategy,
|
strategy,
|
||||||
nodes or list(strategy.qs.nodes()),
|
nodes,
|
||||||
scale=strategy.capacity(read_fraction, write_fraction),
|
scale=strategy.capacity(read_fraction, write_fraction),
|
||||||
scale_by_node_capacity=False,
|
scale_by_node_capacity=False,
|
||||||
read_fraction=read_fraction,
|
read_fraction=read_fraction,
|
||||||
write_fraction=write_fraction)
|
write_fraction=write_fraction,
|
||||||
|
node_limits=node_limits)
|
||||||
|
|
||||||
|
|
||||||
def _plot_node_load_on(ax: plt.Axes,
|
def _plot_node_load_on(ax: plt.Axes,
|
||||||
|
@ -101,7 +116,8 @@ def _plot_node_load_on(ax: plt.Axes,
|
||||||
scale: float,
|
scale: float,
|
||||||
scale_by_node_capacity: bool,
|
scale_by_node_capacity: bool,
|
||||||
read_fraction: Optional[Distribution] = None,
|
read_fraction: Optional[Distribution] = None,
|
||||||
write_fraction: Optional[Distribution] = None):
|
write_fraction: Optional[Distribution] = None,
|
||||||
|
node_limits: List[float] = None):
|
||||||
d = distribution.canonicalize_rw(read_fraction, write_fraction)
|
d = distribution.canonicalize_rw(read_fraction, write_fraction)
|
||||||
x_list = [node.x for node in nodes]
|
x_list = [node.x for node in nodes]
|
||||||
x_index = {x: i for (i, x) in enumerate(x_list)}
|
x_index = {x: i for (i, x) in enumerate(x_list)}
|
||||||
|
@ -113,6 +129,7 @@ def _plot_node_load_on(ax: plt.Axes,
|
||||||
bar_heights[x_index[x]] = 1
|
bar_heights[x_index[x]] = 1
|
||||||
return bar_heights
|
return bar_heights
|
||||||
|
|
||||||
|
width = 0.8
|
||||||
def plot_quorums(sigma: Dict[FrozenSet[T], float],
|
def plot_quorums(sigma: Dict[FrozenSet[T], float],
|
||||||
fraction: float,
|
fraction: float,
|
||||||
bottoms: np.array,
|
bottoms: np.array,
|
||||||
|
@ -127,7 +144,7 @@ def _plot_node_load_on(ax: plt.Axes,
|
||||||
bar_heights,
|
bar_heights,
|
||||||
bottom=bottoms,
|
bottom=bottoms,
|
||||||
color=cmap(0.75 - i * 0.5 / len(sigma)),
|
color=cmap(0.75 - i * 0.5 / len(sigma)),
|
||||||
edgecolor='white', width=0.8)
|
edgecolor='white', width=width)
|
||||||
|
|
||||||
for j, (bar_height, bottom) in enumerate(zip(bar_heights, bottoms)):
|
for j, (bar_height, bottom) in enumerate(zip(bar_heights, bottoms)):
|
||||||
text = ''.join(str(x) for x in sorted(list(quorum))) # type: ignore
|
text = ''.join(str(x) for x in sorted(list(quorum))) # type: ignore
|
||||||
|
@ -136,6 +153,7 @@ def _plot_node_load_on(ax: plt.Axes,
|
||||||
ha='center', va='center')
|
ha='center', va='center')
|
||||||
bottoms += bar_heights
|
bottoms += bar_heights
|
||||||
|
|
||||||
|
# Plot the quorums.
|
||||||
fr = sum(weight * fr for (fr, weight) in d.items())
|
fr = sum(weight * fr for (fr, weight) in d.items())
|
||||||
fw = 1 - fr
|
fw = 1 - fr
|
||||||
read_capacities = np.array([node.read_capacity for node in nodes])
|
read_capacities = np.array([node.read_capacity for node in nodes])
|
||||||
|
@ -145,6 +163,12 @@ def _plot_node_load_on(ax: plt.Axes,
|
||||||
matplotlib.cm.get_cmap('Reds'))
|
matplotlib.cm.get_cmap('Reds'))
|
||||||
plot_quorums(sigma.sigma_w, fw, bottoms,
|
plot_quorums(sigma.sigma_w, fw, bottoms,
|
||||||
write_capacities, matplotlib.cm.get_cmap('Blues'))
|
write_capacities, matplotlib.cm.get_cmap('Blues'))
|
||||||
|
|
||||||
|
# Plot the limits, if there are any.
|
||||||
|
if node_limits is not None:
|
||||||
|
for (i, limit) in enumerate(node_limits):
|
||||||
|
ax.plot([i - width/2, i + width/2], [limit, limit], color='black')
|
||||||
|
|
||||||
ax.set_xticks(x_ticks)
|
ax.set_xticks(x_ticks)
|
||||||
ax.set_xticklabels(str(x) for x in x_list)
|
ax.set_xticklabels(str(x) for x in x_list)
|
||||||
|
|
||||||
|
@ -171,7 +195,7 @@ def _group(segments: Dict[T, Segment]) -> Dict[Segment, List[T]]:
|
||||||
def plot_load_distribution_on(ax: plt.Axes,
|
def plot_load_distribution_on(ax: plt.Axes,
|
||||||
strategy: Strategy[T],
|
strategy: Strategy[T],
|
||||||
nodes: Optional[List[Node[T]]] = None):
|
nodes: Optional[List[Node[T]]] = None):
|
||||||
nodes = nodes or list(strategy.qs.nodes())
|
nodes = nodes or list(strategy.nodes())
|
||||||
|
|
||||||
# We want to plot every node's load distribution. Multiple nodes might
|
# We want to plot every node's load distribution. Multiple nodes might
|
||||||
# have the same load distribution, so we group the nodes by their
|
# have the same load distribution, so we group the nodes by their
|
||||||
|
|
Loading…
Reference in a new issue