Source code for fnss.netconfig.weights
"""
Provides functions to assign and manipulate link weights to a network topology.
"""
import networkx as nx
__all__ = ['set_weights_inverse_capacity',
'set_weights_constant',
'set_weights_delays',
'get_weights',
'clear_weights']
[docs]def set_weights_inverse_capacity(topology):
"""
Assign link weights to links proportionally to the inverse of their
capacity. Weights are normalized so that the minimum weight is 1.
Parameters
----------
topology : Topology
The topology on which weights are applied.
Examples
--------
>>> import fnss
>>> topology = fnss.Topology()
>>> topology.add_path([1,2,3,4])
>>> fnss.set_capacities_constant(topology, 10, 'Mbps')
>>> fnss.set_weights_inverse_capacity(topology)
"""
try:
max_capacity = float(max([topology.edge[u][v]['capacity']
for u, v in topology.edges()]))
except KeyError:
raise ValueError('All links must have a capacity attribute')
for u, v in topology.edges():
capacity = topology.edge[u][v]['capacity']
weight = max_capacity/capacity
topology.edge[u][v]['weight'] = weight
[docs]def set_weights_delays(topology):
"""
Assign link weights to links proportionally their delay. Weights are
normalized so that the minimum weight is 1.
Parameters
----------
topology : Topology
The topology on which weights are applied.
Examples
--------
>>> import fnss
>>> topology = fnss.erdos_renyi_topology(50, 0.1)
>>> fnss.set_delays_constant(topology, 2, 'ms')
>>> fnss.set_weights_delays(topology)
"""
try:
min_delay = float(min([topology.edge[u][v]['delay']
for u, v in topology.edges()]))
except KeyError:
raise ValueError('All links must have a delay attribute')
for u, v in topology.edges():
delay = topology.edge[u][v]['delay']
weight = delay / min_delay
topology.edge[u][v]['weight'] = weight
[docs]def set_weights_constant(topology, weight=1.0, links=None):
"""
Assign a constant weight to all selected links
Parameters
----------
topology : Topology
The topology on which weights are applied.
weight : float, optional
The constant weight to be applied to all links
links : list, optional
List of selected links on which weights are applied. If it is None, all
links are selected
Examples
--------
>>> import fnss
>>> topology = fnss.Topology()
>>> topology.add_edges_from([(1, 2), (5, 8), (4, 5), (1, 7)])
>>> fnss.set_weights_constant(topology, weight=1.0, links=[(1, 2), (5, 8), (4, 5)])
"""
edges = topology.edges() if links is None else links
for u, v in edges:
topology.edge[u][v]['weight'] = weight
[docs]def get_weights(topology):
"""
Returns all the weights.
Parameters
----------
topology : Topology
Returns
-------
weights : dict
Dictionary of weights keyed by link.
Examples
--------
>>> import fnss
>>> topology = fnss.Topology()
>>> topology.add_path([1, 2, 3])
>>> fnss.set_weights_constant(topology, weight=2.0)
>>> weight = fnss.get_weights(topology)
>>> weight[(1,2)]
2.0
"""
return nx.get_edge_attributes(topology, 'weight')
[docs]def clear_weights(topology):
"""
Remove all weights from the topology.
Parameters
----------
topology : Topology
"""
for u, v in topology.edges():
if 'weight' in topology.edge[u][v]:
del topology.edge[u][v]['weight']