.. _backend_concepts: Backends and Batching ===================== "Backend" is the term used in Nexus to mean the provider of quantum (or simulation/emulation) compute power. Backends act as an interface for submitting circuits and provide a way for quantum software to be platform independent: the compilation and execution steps accept an instance of a backend class as an argument. That means that with little alteration, quantum programs can be edited to run against alternative providers, whether simulators, emulators or real quantum hardware. Represented in Python code, a backend is an instance of a class called ``SomethingConfig`` - for example, ``QuantinuumConfig`` - and each provider class will accept or require different parameters. Also, one backend can encompass multiple quantum devices. For example, the ``QuantinuumConfig`` backend accepts a ``device_name`` parameter which allows the calling code to choose between the available hardware devices, syntax checkers and emulators. Supported backends ------------------ The following backends are supported: * `Aer `_ - a Nexus-hosted simulator running Qiskit's Aer engine (AerState and AerUnitary are also supported). * `Braket `_ - hosted on Amazon Web Services (AWS), Braket offers access to multiple quantum computers from IonQ, IQM and Rigetti. Will require you to share your :ref:`credentials ` into Nexus. * `Quantinuum `_ - access to H-Series quantum computers, simulators and emulators. When you use these options through Nexus, your Nexus login is automatically used to interact with H-Series, where necessary. Your account may have access to any or all of ``H1``, ``H2``, syntax checkers, simulators and emulators with advanced noise models. Emulators may be hosted by Nexus or by Quantinuum. In this context, "Hosted by Nexus" means that use will be via your Nexus quota and Nexus's internal job queue, whereas "Hosted by Quantinuum" means that use will be via your H-System Quantum Credits (HQS) and subject to the queuing explained in the H-Series documentation. * `IBMQ `_ - access to hardware hosted by IBM on the IBM Quantum Platform . Will require you to share your :ref:`credentials ` into Nexus. * IBMQEmulator - runs circuits on a Nexus-hosted simulator which uses the noise model of a specific IBM quantum device. * `ProjectQ `_ - a Nexus-hosted simulator running the ProjectQ engine. * `Qulacs `_ - a Nexus-hosted simulator running the Qulacs engine. Find out more about the backends available through Nexus from the "Backends" link in the main menu. For full details about backends, refer to ``pytket`` documentation section on :ref:`backends `. Nexus uses ``pytket`` to convert circuits to run on different providers, so Nexus backends correspond to ``pytket`` backends. Batching behavior ------------------ Quantinuum backends ~~~~~~~~~~~~~~~~~~~ If you expect to run multiple circuits, or several circuits in succession (such as during a variational project), you can request that the H-series submission queue batches your circuits together so they avoid queueing separately. Circuits submitted to an existing batch will run immediately, provided they are submitted within 60 seconds of the completion of the last circuit you submitted to the batch. You can request that Nexus attempts to batch your circuits by setting the ``attempt_batching`` flag to ``True`` when using ``QuantinuumConfig``. Batching will only work when you have ``attempt_batching=True`` and you are: * executing a circuit - this will initiate a batch. * executing a list of circuits - this will initiate a batch and submit all the circuits to that batch. * executing circuit(s) in the 60 second window after the completion of the most recent circuit in an existing batch (we try to keep Nexus fast, but please account for some network latency). If your batch has expired, a new batch will be created but the first job will have to wait in the H-series queue until it is selected. Batching will take place up to the ``max_batch_cost`` limit that you can specify in the ``QuantinuumConfig``. The default limit is 2000 Quantinuum Credits (HQC). IBMQ backends ~~~~~~~~~~~~~ If you submit circuits in one :ref:`Nexus job` then, because Nexus uses `pytket-qiskit `_ internally, it will attempt to take advantage of IBM's `"batch" execution mode `_. Your job's circuits are first grouped according to ``n_shots`` and then the groups are invoked on IBMQ in batches. Other backends ~~~~~~~~~~~~~~ Automatic batching through :ref:`Nexus jobs` is not currently supported for other backends. About credentials ----------------- To use any of the backends other than H-Series, you must provide your own :ref:`credentials ` from that service.