Host¶
The Host component is analogous to a host, or node in a classical network. Hosts in QuNetSim act either as a routing node that can relay packets through the network, or they can act as a node that runs a specific protocol. It is up to the protocol developer to configure how the nodes behave. In most cases, once the network is established, users will run specific protocols on the nodes. In the examples we see how to accomplish this.
One other feature of a host is that they can also sniff packets, or eavesdrop on channels to manipulate the payload of the packet. For example, they can apply random noise to any qubit or change the classical messages that are routed through them. We see an example of that in the examples section.
The most commonly used methods for Hosts are:
- add_connection(host_id)
- Add a classical and quantum connection to the host with id host_id 
 
 
- get_classical(host_id, wait=N)
- Get a classical message from sender with host_id host_id and wait N seconds for it 
 
 
- get_qubit(host_id, wait=N):
- Get a data qubit from sender with host_id host_id and wait N seconds for it 
 
 
- get_qubits(host_id):
- Get all data qubits from sender with host_id host_id 
 
 
- get_epr(host_id, q_id=q_id):
- Get EPR pair with qubit ID q_id from sender with host_id host_id. If q_id=None then get the first free EPR pair 
 
 
- get_epr_pairs(host_id):
- Get all EPR pairs established with host with host_id host_id 
 
 
- send_classical(host_id, message, await_ack=<bool>):
- Send the classical message message to host with host_id host_id. Block until ACK arrives if await_ack=True 
 
 
- send_key(host_id, key_size):
- Send a secret key via QKD of length key_size to host with ID receiver_id. 
 
 
- send_qubit(host_id, qubit, await_ack=<bool>):
- Send qubit qubit to host with host_id host_id. Block until ACK arrives if await_ack=True. 
 
 
- send_superdense(host_id, message, await_ack=<bool>):
- Send a message (one of ‘00’, ‘01’, ‘10’, or ‘11’) as a superdense message 
 
 
- send_teleport(host_id, qubit, await_ack=<bool>):
- Teleport qubit qubit to host with host_id host_id. 
 
 
- send_epr(host_id, qubit_id=<None>, await_ack=<bool>):
- Creates a shared EPR pair with the host with host_id host_id. 
 
 
- send_ghz([host_id_list], qubit_id=<None>, await_ack=<bool>):
- Creates a shared GHZ state with all hosts in the list [host_id_list]. 
 
 
- shares_epr(host_id):
- Returns if the host shares entanglement already with host with host_id host_id 
 
 
- run_protocol(protocol, protocol_params):
- Run the function protocol with the parameters protocol_params. 
 
 
- 
class qunetsim.components.host.Host(host_id, backend=None)¶
- Bases: - object- Host object acting as either a router node or an application host node. - 
_get_message_w_seq_num(sender_id, seq_num, wait)¶
- Get a message from a sender with a specific sequence number. :param sender_id: The ID of the sender :type sender_id: str :param seq_num: The sequence number :type seq_num: int :param wait: The amount of time to wait. (-1 to wait forever) :type wait: int - Returns
- The message 
- Return type
- (Message) 
 
 - 
_log_ack(protocol, receiver, seq)¶
- Logs acknowledgement messages. :param protocol: The protocol for the ACK :type protocol: str :param receiver: The sender of the ACK :type receiver: str :param seq: The sequence number of the packet :type seq: int 
 - 
_process_ack(sender, seq_num)¶
- Processes an ACK msg. - Parameters
- sender (str) – The sender of the ack 
- seq_num (int) – The sequence number of the ack 
 
 
 - 
_process_packet(packet)¶
- Processes the received packet. - Parameters
- packet (Packet) – The received packet 
 
 - 
_process_queue()¶
- Runs a thread for processing the packets in the packet queue. 
 - 
add_c_connection(receiver_id)¶
- Adds the classical connection to host with ID receiver_id. - Parameters
- receiver_id (str) – The ID of the host to connect with. 
 
 - 
add_c_connections(receiver_ids)¶
- Adds the classical connections to host with ID receiver_id. - Parameters
- receiver_ids (list) – The IDs of the hosts to connect with. 
 
 - 
add_checksum(qubits, size_per_qubit=2)¶
- Generate a set of qubits that represent a quantum checksum for the set of qubits qubits - Parameters
- qubits (list) – The set of qubits to encode 
- size_per_qubit (int) – The size of the checksum per qubit (i.e. 1 qubit encoded into size) 
 
- Returns
- A list of qubits that are encoded for qubits 
- Return type
- (list) 
 
 - 
add_connection(receiver_id)¶
- Adds the classical and quantum connection to host with ID receiver_id. - Parameters
- receiver_id (str) – The ID of the host to connect with. 
 
 - 
add_connections(receiver_ids)¶
- Adds the classical and quantum connections to host with ID receiver_id. - Parameters
- receiver_ids (list) – A list of receiver IDs to connect with 
 
 - 
add_data_qubit(host_id, qubit, q_id=None)¶
- Adds the data qubit to the data qubit store of a host. If the qubit has an ID, adds the qubit with it, otherwise generates an ID for the qubit and adds the qubit with that ID. - Parameters
- host_id (str) – The ID of the host to pair the qubit 
- qubit (Qubit) – The data Qubit to be added. 
- q_id (str) – the ID to set the qubit ID to 
 
- Returns
- The qubit ID 
- Return type
- (str) 
 
 - 
add_epr(host_id, qubit, q_id=None, blocked=False)¶
- Adds the EPR to the EPR store of a host. If the EPR has an ID, adds the EPR with it, otherwise generates an ID for the EPR and adds the qubit with that ID. - Parameters
- host_id (str) – The ID of the host to pair the qubit 
- qubit (Qubit) – The data Qubit to be added. 
- q_id (str) – The ID of the qubit to be added. 
- blocked (bool) – If the qubit should be stored as blocked or not 
 
- Returns
- The qubit ID 
- Return type
- (str) 
 
 - 
add_ghz_qubit(host_id, qubit, q_id=None)¶
- Adds the GHZ qubit to the storage of the host. The host id corresponds to the generator of the GHZ state. - Parameters
- host_id (str) – The ID of the host to pair the qubit 
- qubit (Qubit) – The data Qubit to be added. 
- q_id (str) – the ID to set the qubit ID to 
 
- Returns
- The qubit ID 
- Return type
- (str) 
 
 - 
add_q_connection(receiver_id)¶
- Adds the quantum connection to host with ID receiver_id. - Parameters
- receiver_id (str) – The ID of the host to connect with. 
 
 - 
add_q_connections(receiver_ids)¶
- Adds the quantum connection to host with ID receiver_id. - Parameters
- receiver_ids (list) – The IDs of the hosts to connect with. 
 
 - 
add_w_qubit(host_id, qubit, q_id=None)¶
- Adds the W qubit to the storage of the host. The host id corresponds to the generator of the W state. - Parameters
- host_id (str) – The ID of the host to pair the qubit 
- qubit (Qubit) – The data Qubit to be added. 
- q_id (str) – the ID to set the qubit ID to 
 
- Returns
- The qubit ID 
- Return type
- (str) 
 
 - 
await_ack(sequence_number, sender)¶
- Block until an ACK for packet with sequence number arrives. - Parameters
- sequence_number (int) – The sequence number to wait for. 
- sender (str) – The sender of the ACK 
 
- Returns
- The status of the ACK 
- Return type
- (bool) 
 
 - 
await_remaining_acks(sender)¶
- Awaits all remaining ACKs of one sender. - Parameters
- sender (str) – sender for which to wait for all acks. 
 
 - 
property c_relay_sniffing¶
- If the host should sniff classical packets. - Returns
- If the host should sniff classical packets. 
- Return type
- (bool) 
 
 - 
property c_relay_sniffing_fn¶
- The function to apply to the qubits in transit. - Returns
- The function to apply to the qubits in transit. 
- Return type
- (function) 
 
 - 
change_epr_qubit_id(host_id, new_id, old_id=None)¶
- Change an EPR pair ID to another. If old_id is set, then change that specific EPR half, otherwise change the first unblocked EPR half to the new_id. - Parameters
- host_id (str) – The partner ID of the EPR pair. 
- new_id (str) – The new ID to change the qubit too 
- old_id (str) – The old ID of the qubit 
 
- Returns
- Old if of the qubit which has been changed. 
- Return type
- (str) 
 
 - 
property classical¶
- Gets the received classical messages sorted with the sequence number. - Returns
- Sorted list of classical messages. 
- Return type
- (list) 
 
 - 
property classical_connections¶
- Gets the classical connections of the host. - Returns
- classical connections 
- Return type
- (dict) 
 
 - 
property delay¶
- Get the delay of the queue processor. - Returns
- The delay per tick for the queue processor. 
- Return type
- (float) 
 
 - 
delete_key(partner_id)¶
- Deletes a key shared with a partner by QKD. Should be used if a key was eavesdropped and/or a new key should be shared. If there is no key shared, nothing happens. - Parameters
- partner_id (str) – The ID of the key partner 
 
 - 
empty_classical(reset_seq_nums=False)¶
- Empty the classical message buffers. - Parameters
- reset_seq_nums (bool) – if all sequence number should also be reset. 
 
 - 
get_classical(host_id, seq_num=None, wait=0)¶
- Get the classical messages from partner host host_id. If you need the next classical message from the host, don’t pass a seq_num, but use get_next_classical instead. This is much faster. - Parameters
- host_id (str) – The ID of the partner who sent the clasical messages 
- seq_num (int) – The sequence number of the message 
- wait (float) – How long in seconds to wait for the messages if none are set. 
 
- Returns
- A list of classical messages from Host with ID host_id. 
- Return type
- (list) 
 
 - 
get_connections()¶
- Get a list of the connections with the types. - Returns
- The list of connections for this host. 
- Return type
- (list) 
 
 - 
get_qubit(host_id, q_id=None, wait=0)¶
- Gets the data qubit received from another host in the network. If qubit ID is specified, qubit with that ID is returned, else, the last qubit received is returned. - Parameters
- host_id (str) – The ID of the host that data qubit to be returned is received from. 
- q_id (str) – The qubit ID of the data qubit to get. 
- wait (float) – The amount of time to wait for the a qubit to arrive 
 
- Returns
- Qubit received from the host with host_id and q_id. 
- Return type
- (Qubit) 
 
 - 
get_qubits(host_id, remove_from_storage=False)¶
- Return the dictionary of data qubits stored, just for the information regarding which qubits are stored. Optional to remove the qubits from storage like get_qubit does with remove_from_storage field. - Parameters
- host_id (str) – The host id from which the data qubit have been received. 
- remove_from_storage (bool) – Get and remove from storage. 
 
- Returns
- If host_id is not set, then return the entire dictionary of data qubits.
- Else If host_id is set, then return the data qubits for that particular host if there are any. Return an empty list otherwise. 
 
- Return type
- (dict) 
 
 - 
get_epr(host_id, q_id=None, wait=0)¶
- Gets the EPR that is entangled with another host in the network. If qubit ID is specified, EPR with that ID is returned, else, the last EPR added is returned. - Parameters
- host_id (str) – The ID of the host that returned EPR is entangled to. 
- q_id (str) – The qubit ID of the EPR to get. 
- wait (float) – the amount of time to wait 
 
- Returns
- Qubit shared with the host with host_id and q_id. 
- Return type
- (Qubit) 
 
 - 
get_epr_pairs(host_id)¶
- Return the dictionary of EPR pairs stored, just for the information regarding which qubits are stored. Does not remove the qubits from storage like get_epr_pair does. - Parameters
- host_id (str) – Get the EPR pairs established with host with host_id 
- Returns
- If host_id is not set, then return the entire dictionary of EPR pairs.
- Else If host_id is set, then return the EPRs for that particular host if there are any. Return an empty list otherwise. 
 
- Return type
- (dict) 
 
 - 
get_ghz(host_id, q_id=None, wait=0)¶
- Gets the GHZ qubit which has been created by the host with the host ID host_id. It is not necessary to know with whom the states are shared. - Parameters
- host_id (str) – The ID of the host that creates the GHZ state. 
- q_id (str) – The qubit ID of the GHZ to get. 
- wait (float) – the amount of time to wait 
 
- Returns
- Qubit shared with the host with host_id and q_id. 
- Return type
- (Qubit) 
 
 - 
get_key(receiver_id, wait=-1)¶
- Should be called after send_key is called. Blocks, till the key sharing is finished and returns the key and the amount of attemptes needed in QKD. From this value, the user can decide if the transmission was assumed safe or not. - Parameters
- receiver_id (str) – The ID of the key partner 
- wait (float) – The amount to wait for the key, -1 to wait forever. 
 
- Returns
- The key, as a list of ints, and the amount of attempts needed 
- Return type
- (key, int) 
 
 - 
get_next_classical(sender_id, wait=-1)¶
- Gets the next classical message available from a sender. If wait is -1 (default), it is waited till a message arrives. - Parameters
- sender_id (str) – ID of the sender from the returned message. 
- wait (int) – waiting time, default forever. 
 
- Returns
- The message or None 
- Return type
- (str) 
 
 - 
get_next_sequence_number(host)¶
- Get and set the next sequence number of connection with a receiver. - Parameters
- host (str) – The ID of the receiver 
- Returns
- The next sequence number of connection with a receiver. 
- Return type
- (int) 
 
 - 
get_number_of_data_qubits(host_id)¶
- Return the number of data qubits associated with host host_id. - Parameters
- host_id (str) – 
- Returns
- Return type
- (int) 
 
 - 
get_qubit_by_id(q_id)¶
- Return the qubit that has the id q_id from the quantum storage. - Parameters
- q_id (str) – The ID of the qubit 
- Returns
- The qubit with the id q_id or None if it does not exist 
- Return type
- (Qubit) 
 
 - 
get_sequence_number(host)¶
- Get the sequence number on the sending side of connection with a host host. - Parameters
- host (str) – The ID of the sender 
- Returns
- The next sequence number of connection with a receiver. 
- Return type
- (int) 
 
 - 
get_sequence_number_receiver(host)¶
- Get the sequence number on the receiving side of the connection with host host. - Parameters
- host (str) – The ID of the connected host 
- Returns
- The receiver sequence number. 
- Return type
- (int) 
 
 - 
get_w(host_id, q_id=None, wait=0)¶
- Gets the W qubit which has been created by the host with the host ID host_id. It is not necessary to know with whom the states are shared. - Parameters
- host_id (str) – The ID of the host that creates the GHZ state. 
- q_id (str) – The qubit ID of the W to get. 
- wait (float) – the amount of time to wait 
 
- Returns
- Qubit shared with the host with host_id and q_id. 
- Return type
- (Qubit) 
 
 - 
property host_id¶
- Get the host_id of the host. - Returns
- The host ID of the host. 
- Return type
- (str) 
 
 - 
is_idle()¶
- Returns if the host has packets to process or is idle. - Returns
- If the host is idle or not. 
- Return type
- (bool) 
 
 - 
property max_ack_wait¶
- Get the maximum amount of time to wait for an ACK - Returns
- The maximum amount of time to wait for an ACK 
- Return type
- (float) 
 
 - 
property q_relay_sniffing¶
- If the host should sniff quantum packets. - Returns
- If the host should sniff quantum packets. 
- Return type
- (bool) 
 
 - 
property q_relay_sniffing_fn¶
- The function to apply to the qubits in transit. - Returns
- The function to apply to the qubits in transit. 
- Return type
- (function) 
 
 - 
property quantum_connections¶
- Get the quantum connections for the host. - Returns
- The quantum connections for the host. 
- Return type
- (dict) 
 
 - 
quantum_relay_sniffing_function(sender, receiver, qubit)¶
- Calls the quantum relay sniffing function if one is set. 
 - 
rec_packet(packet)¶
- Puts the packet into the packet queue of the host. - Parameters
- packet – Received packet. 
 
 - 
relay_sniffing_function(sender, receiver, transport_packet)¶
- The function called for packet sniffing. - Parameters
- sender (str) – the sender of the packet 
- receiver (str) – the receiver of the packet 
- transport_packet (Packet) – the packet itself 
 
 
 - 
remove_c_connection(receiver_id)¶
- Remove the classical connection with receiver with receiver ID receiver_id. :param receiver_id: The ID of the receiving side of the classical connection :type receiver_id: str - Returns
- Success status of the removal 
- Return type
- (bool) 
 
 - 
remove_connection(receiver_id)¶
- Remove a classical and quantum connection from a host. :param receiver_id: The ID of the connection to remove :type receiver_id: str - Returns
- a two element list of the status of the removals. 
- Return type
- (list) 
 
 - 
remove_q_connection(receiver_id)¶
- Remove the quantum connection with receiver with receiver ID receiver_id. :param receiver_id: The ID of the receiving side of the quantum connection :type receiver_id: str - Returns
- Success status of the removal 
- Return type
- (bool) 
 
 - 
reset_data_qubits(host_id=None)¶
- Remove all qubits associated with host_id else remove all qubits if host_id not set. - Parameters
- host_id (str) – The host ID to remove associated qubits with. 
 
 - 
reset_sequence_numbers()¶
- Reset all sequence numbers. 
 - 
run_protocol(protocol, arguments=(), blocking=False)¶
- Run the protocol protocol. - Parameters
- protocol (function) – The protocol that the host should run. 
- arguments (tuple) – The set of (ordered) arguments for the protocol 
- blocking (bool) – Wait for thread to stop before proceeding 
 
- Returns
- The thread the protocol is running on 
- Return type
- (DaemonThread) 
 
 - 
send_ack(receiver, seq_number)¶
- Sends the classical message to the receiver host with ID:receiver - Parameters
- receiver (str) – The ID of the host to send the message. 
- seq_number (int) – Sequence number of the acknowleged packet. 
 
 
 - 
send_broadcast(message)¶
- Send a broadcast message to all of the network. - Parameters
- message (str) – The message to broadcast 
 
 - 
send_classical(receiver_id, message, await_ack=False, no_ack=False)¶
- Sends the classical message to the receiver host with ID:receiver - Parameters
- receiver_id (str) – The ID of the host to send the message. 
- message (str) – The classical message to send. 
- await_ack (bool) – If sender should wait for an ACK. 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
 
- Returns
- (bool) If await_ack=True, return the status of the ACK 
 
 - 
send_epr(receiver_id, q_id=None, await_ack=False, no_ack=False, block=False)¶
- Establish an EPR pair with the receiver and return the qubit ID of pair. - Parameters
- receiver_id (str) – The receiver ID 
- q_id (str) – The ID of the qubit 
- await_ack (bool) – If sender should wait for an ACK. 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
- block (bool) – If the created EPR pair should be blocked or not. 
 
- Returns
- If await_ack=True, return the ID of the EPR pair and the status of the ACK 
- Return type
- (str, bool) 
 
 - 
send_ghz(receiver_list, q_id=None, await_ack=False, no_ack=False, distribute=False)¶
- Share GHZ state with all receiver ids in the list. GHZ state is generated locally. - Parameters
- receiver_list (list) – A List of all Host IDs with which a GHZ state should be shared. 
- q_id (str) – The ID of the GHZ qubits 
- await_ack (bool) – If the sender should await an ACK from all receivers 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
- distribute (bool) – If the sender should keep part of the GHZ state, or just distribute one 
 
- Returns
- Qubit ID of the shared GHZ and ACK status 
- Return type
- (str, bool) 
 
 - 
send_key(receiver_id, key_size, await_ack=True)¶
- Send a secret key via QKD of length key_size to host with ID receiver_id. The ACK is returned before the QKD protocol is completley finished! - Parameters
- receiver_id (str) – The ID of the receiver 
- key_size (int) – The size of the key 
- await_ack (bool) – If the host should wait for an ACk 
 
- Returns
- Status of ACK, returned at the beginning of the protocol 
- Return type
- (bool) 
 
 - 
send_qubit(receiver_id, q, await_ack=False, no_ack=False)¶
- Send the qubit q to the receiver with ID receiver_id. - Parameters
- receiver_id (str) – The receiver ID to send the message to 
- q (Qubit) – The qubit to send 
- await_ack (bool) – If sender should wait for an ACK. 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
 
- Returns
- If await_ack=True, return the ID of the qubit and the status of the ACK 
- Return type
- (str, bool) 
 
 - 
send_superdense(receiver_id, message, await_ack=False, no_ack=False)¶
- Send the two bit binary (i.e. ‘00’, ‘01’, ‘10’, ‘11) message via superdense coding to the receiver with receiver ID receiver_id. - Parameters
- receiver_id (str) – The receiver ID to send the message to 
- message (str) – The two bit binary message 
- await_ack (bool) – If sender should wait for an ACK. 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
 
- Returns
- (bool) If await_ack=True, return the status of the ACK 
 
 - 
send_teleport(receiver_id, q, await_ack=False, no_ack=False, payload=None, generate_epr_if_none=True)¶
- Teleports the qubit q with the receiver with host ID receiver - Parameters
- receiver_id (str) – The ID of the host to establish the EPR pair with 
- q (Qubit) – The qubit to teleport 
- await_ack (bool) – If sender should wait for an ACK. 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
- payload – 
- generate_epr_if_none – Generate an EPR pair with receiver if one doesn’t exist 
 
- Returns
- (bool) If await_ack=True, return the status of the ACK 
 
 - 
send_w(receiver_list, q_id=None, await_ack=False, no_ack=False, distribute=False)¶
- Share W state with all receiver ids in the list. W state is generated locally. - Parameters
- receiver_list (list) – A List of all Host IDs with which a W state should be shared. 
- q_id (str) – The ID of the W qubits 
- await_ack (bool) – If the sender should await an ACK from all receivers 
- no_ack (bool) – If this message should not use any ACK and sequencing. 
- distribute (bool) – If the sender should keep part of the W state, or just distribute one 
 
- Returns
- Qubit ID of the shared W and ACK status 
- Return type
- (str, bool) 
 
 - 
set_data_qubit_memory_limit(limit, host_id=None)¶
- Set the limit to how many data qubits can be stored from host_id, or if host_id is not set, use the limit for all connections. - Parameters
- limit (int) – The maximum number of qubits for the memory 
- host_id (str) – (optional) The partner ID to set the limit with 
 
 
 - 
set_epr_memory_limit(limit, host_id=None)¶
- Set the limit to how many EPR pair halves can be stored from host_id, or if host_id is not set, use the limit for all connections. - Parameters
- limit (int) – The maximum number of qubits for the memory 
- host_id (str) – (optional) The partner ID to set the limit with 
 
 
 - Returns boolean value dependent on if the host shares an EPR pair with receiver with ID receiver_id - Parameters
- receiver_id (str) – The receiver ID to check. 
- Returns
- Whether the host shares an EPR pair with receiver with ID receiver_id 
- Return type
- (bool) 
 
 - 
property sniff_full_packet¶
- If the eavesdropper should get the whole packet or just the payload. - Returns
- If the eavesdropper should get the whole packet or just the
- payload. 
 
- Return type
- (bool) 
 
 - 
start()¶
- Starts the host. 
 - 
stop(release_qubits=True)¶
- Stops the host. If release_qubit is true, clear the quantum memories. - Parameters
- (boolean) – If release_qubit is true, clear the quantum memories. 
 
 - 
property storage_epr_limit¶
- Get the maximum number of qubits that can be held in EPR memory. - Returns
- The maximum number of qubits that can be held in EPR memory. 
- Return type
- (int) 
 
 - 
property storage_limit¶
- Get the maximum number of qubits that can be held in data qubit memory. - Returns
- The maximum number of qubits that can be held in data qubit memory. 
- Return type
- (int) 
 
 
- 
- 
qunetsim.components.host._get_qubit(store, host_id, q_id, purpose, wait=0)¶
- Gets the data qubit received from another host in the network. If qubit ID is specified, qubit with that ID is returned, else, the last qubit received is returned. - Parameters
- store – The qubit storage to retrieve the qubit 
- host_id (str) – The ID of the host that data qubit to be returned is received from. 
- q_id (str) – The qubit ID of the data qubit to get. 
- purpose (str) – The intended use of the qubit 
 
- Returns
- Qubit received from the host with host_id and q_id. 
- Return type
- (Qubit)