Routing Examples¶
Examples demonstrating network routing algorithms.
Dijkstra¶
dijkstra.py¶
1from kosmos.protocols.config.protocol import RoutingProtocolConfig
2from kosmos.protocols.routing.dijkstra_routing import DijkstraRoutingProtocol
3from kosmos.topology.link import ClassicalLink, LinkId, LinkType, OpticalLink, QuantumLink
4from kosmos.topology.net import Network
5from kosmos.topology.node import ClassicalNode, NodeId, NodeRole, QuantumNode
6
7NODES = [
8 ("A", ClassicalNode, {"roles": [NodeRole.END_USER]}),
9 ("QB", QuantumNode, {"roles": [NodeRole.ROUTER], "num_qubits": 10, "coherence_time": 1.0}),
10 ("C", ClassicalNode, {"roles": [NodeRole.ROUTER]}),
11 ("D", ClassicalNode, {"roles": [NodeRole.ROUTER]}),
12 ("QE", QuantumNode, {"roles": [NodeRole.END_USER], "num_qubits": 5, "coherence_time": 0.5}),
13 ("F", ClassicalNode, {"roles": [NodeRole.ROUTER]}),
14]
15
16LINKS = [
17 ("AB", "A", "QB", ClassicalLink, {"distance": 10000.0, "bandwidth": 1e9}),
18 ("AC", "A", "C", ClassicalLink, {"distance": 5000.0, "bandwidth": 1e9}),
19 ("AD", "A", "D", ClassicalLink, {"distance": 15000.0, "bandwidth": 1e9}),
20 ("CD", "C", "D", ClassicalLink, {"distance": 8000.0, "bandwidth": 1e9}),
21 ("DF", "D", "F", ClassicalLink, {"distance": 12000.0, "bandwidth": 1e9}),
22 ("EF", "QE", "F", ClassicalLink, {"distance": 900000.0, "bandwidth": 1e9}),
23 ("QBE", "QB", "QE", QuantumLink, {"distance": 2000.0, "repetition_rate": 1e6}),
24]
25
26
27def create_example_network() -> Network:
28 """Create an example network."""
29 network = Network()
30 nodes = {}
31
32 # Create nodes
33 for node_id, node_class, params in NODES:
34 defaults = {"has_transceiver": True} if node_class == QuantumNode else {}
35 node = node_class(id=NodeId(node_id), **defaults, **params)
36 network.add_node(node)
37 nodes[node_id] = node
38
39 # Create links
40 for link_id, src_id, dst_id, link_class, params in LINKS:
41 defaults = {"attenuation": 0.0002, "signal_speed": 200.0}
42 if link_class == QuantumLink:
43 defaults["polarization_fidelity"] = 0.99
44 link = link_class(
45 id=LinkId(link_id), src=nodes[src_id], dst=nodes[dst_id], **defaults, **params
46 )
47 network.add_link(link)
48
49 return network
50
51
52def main() -> None:
53 """Run Dijkstra routing protocol example."""
54 network = create_example_network()
55
56 # Run Dijkstra from A to QE
57 source, target = network.get_node("A"), network.get_node("QE")
58
59 config_cost = RoutingProtocolConfig(
60 allowed_link_types=[LinkType.QUANTUM, LinkType.CLASSICAL], cost_function="cost"
61 )
62 result_cost = DijkstraRoutingProtocol(config_cost, network, source, target).execute()
63
64 config_distance = RoutingProtocolConfig(
65 allowed_link_types=[LinkType.QUANTUM, LinkType.CLASSICAL], cost_function="distance"
66 )
67 result_distance = DijkstraRoutingProtocol(config_distance, network, source, target).execute()
68
69 output = ["\n=== Nodes ==="]
70 output.extend(f"{node.id}: {node.__class__.__name__}" for node in network.nodes())
71
72 output.append("\n=== Links ===")
73 for link in network.links():
74 if not isinstance(link, OpticalLink):
75 msg = "Only optical links are supported."
76 raise TypeError(msg)
77 output.append(
78 f"{link.id}: {link.src.id} <--> {link.dst.id} ({link.__class__.__name__}); "
79 f"Dist: {link.distance:.4f}, Cost: {link.weight:.4g}"
80 )
81
82 output.append("\n=== Dijkstra Routing (by Cost) ===")
83 output.append(str(result_cost))
84
85 output.append("\n=== Dijkstra Routing (by Distance) ===")
86 output.append(str(result_distance))
87
88 print("\n".join(output)) # noqa: T201
89
90
91if __name__ == "__main__":
92 main()