Source code for qrisp.interface.thrift_interface.backend_client

"""
\********************************************************************************
* Copyright (c) 2023 the Qrisp authors
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is
* available at https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
"""


import sys

from qrisp.interface.circuit_converter import convert_circuit
from qrisp.interface.thrift_interface.codegen import BackendService


class BackendClient(BackendService.Client):
    """
    This object allows connecting to Qrisp backend servers.

    Parameters
    ----------
    socket_ip : string
        The IP address of the socket of the target server.
    port : int
        The port on which the server is listening.


    Examples
    --------

    We assume that the example from BackendServer has been executed in the same console.

    >>> from qrisp.interface import BackendClient
    >>> example_backend = BackendClient(socket_ip = "127.0.0.1", port = 8080)
    >>> from qrisp import QuantumCircuit
    >>> qc = QuantumCircuit(2)
    >>> qc.h(0)
    >>> qc.cx(0,1)
    >>> qc.measure(qc.qubits)
    >>> example_backend.run(qc, shots = 1000, token = "lorem ipsum")
    lorem ipsum
    {'0 0': 464, '1 1': 536}



    """

[docs] def __init__(self, socket_ip, port=None): from thrift.protocol import TBinaryProtocol from thrift.transport import TSocket, TTransport if port is None: port = 9010 # Create the transport for the User Interface to the server self.transport = TSocket.TSocket(socket_ip, port) # Buffering is critical. Raw sockets are very slow self.transport = TTransport.TBufferedTransport(self.transport) # Wrap in a protocol protocol = TBinaryProtocol.TBinaryProtocol(self.transport) self.socket_ip = socket_ip # Create a client to use the protocol encoder # client = BackendService.Client(protocol) super().__init__(protocol) # Connect! self.transport.open()
# Destructor closes the transport def __del__(self): self.transport.close()
[docs] def run(self, qc, shots, token=""): """ Executes the ``run_func`` of the server. Parameters ---------- qc : QuantumCircuit The QuantumCircuit to execute. shots : int The amount of shots. token : str, optional A token which can be used for backend execution parameter specification. The default is "". Returns ------- dict A dictionary representing the counts where the keys are bitstrings and the values are integers. """ converted_circuit = convert_circuit(qc, "thrift", transpile=False) return super().run(converted_circuit, shots, token)
[docs] def ping(self): """ Executes the ``ping_func`` on the server. Returns ------- BackendStatus object An object which contains general information about the backend. """ return super().ping()