Source code for kosmos.protocols.circuit_execution_protocol

from qiskit import QuantumCircuit

from kosmos.circuit_runner.qiskit_runner import AerSimulatorRunner, QiskitRunner
from kosmos.protocols.config.protocol import CircuitExecutionProtocolConfig
from kosmos.protocols.protocol import Protocol
from kosmos.protocols.protocol_result import CircuitExecutionProtocolResult
from kosmos.protocols.status import ProtocolStatus
from kosmos.topology.net import Network


[docs] class CircuitExecutionProtocol(Protocol): """Protocol for executing a circuit partition on a quantum node. Attributes: circuit_runner (QiskitRunner): The circuit runner to execute the circuit. circuit (QuantumCircuit): The quantum circuit to execute. """ def __init__( self, config: CircuitExecutionProtocolConfig, network: Network, circuit_runner: QiskitRunner, circuit: QuantumCircuit, ) -> None: """Initialize the circuit execution protocol. Args: config (CircuitExecutionProtocolConfig): Circuit execution config. network (Network): The network topology. circuit_runner (QiskitRunner): The circuit runner to execute the circuit. circuit (QuantumCircuit): The quantum circuit to execute. """ super().__init__(config, network) self.config = config self.circuit_runner = circuit_runner self.circuit = circuit
[docs] def execute(self) -> CircuitExecutionProtocolResult: """Execute the quantum circuit. Returns: CircuitExecutionProtocolResult: Result of the circuit execution. """ self.status = ProtocolStatus.RUNNING density_matrix = None if isinstance(self.circuit_runner, AerSimulatorRunner): density_matrix, _ = self.circuit_runner.density_matrix(self.circuit) execution_time = ( self.circuit.depth() * (self.config.local_gate_time * 2) + self.circuit.num_qubits * self.config.measurement_time ) self.status = ProtocolStatus.SUCCESS return CircuitExecutionProtocolResult( status=self.status, execution_time=execution_time, density_matrix=density_matrix, )