Source code for fnss.netconfig.weights
"""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.adj[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.adj[u][v]['capacity']
weight = max_capacity / capacity
topology.adj[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.adj[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.adj[u][v]['delay']
weight = delay / min_delay
topology.adj[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 : iterable, optional
Iterable container 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 = links or topology.edges()
for u, v in edges:
topology.adj[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():
topology.adj[u][v].pop('weight', None)