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()