{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "2d6582ed-04c1-44bb-9dd8-042d46bd8a7b",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Schnellstart für Executor\"\n",
        "description: \"So verwenden Sie die „Executor“-Primitive in qiskit-ibm-runtime.\"\n",
        "\n",
        "---\n",
        "\n",
        "<span id=\"executor-quickstart\" />\n",
        "\n",
        "# Schnellstart für Executor\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b91b019e-f1d9-4a7f-9c5a-68ead8bf2a6d",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Paketversionen\">\n",
        "    Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt.\n",
        "    Wir empfehlen, diese Versionen oder neuere zu verwenden.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    samplomatic~=0.21.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e82a5b3c-eed9-41fe-8940-e88838101ca3",
      "metadata": {},
      "source": [
        "Ähnlich wie die „[Sampler](/docs/guides/get-started-with-sampler) “-Primitive liest der „Executor“ die Ausgaberegister von Quantenkreisausführungen aus, verfügt jedoch über keine integrierte Fehlerunterdrückung oder -minderung. Vielmehr ist es Teil des [Modells](/docs/guides/directed-execution-model) der gesteuerten Ausführung, das die Voraussetzungen dafür schafft, Designabsichten auf der Client-Seite zu erfassen, und die aufwendige Generierung von Schaltungsvarianten auf die Server-Seite verlagert. Der Executor befolgt die in den Schaltkreis-Anmerkungen und -Optionen angegebenen Anweisungen, generiert und bindet Parameterwerte, führt die gebundenen Schaltkreise auf der Hardware aus und gibt die Ausführungsergebnisse sowie Metadaten zurück. Es trifft keine stillschweigenden Entscheidungen für Sie und bietet Ihnen volle Kontrolle und Transparenz.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Das Qiskit-Paket verfügt noch nicht über eine Basisklasse für die Executor-Primitive.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"before-you-begin\" />\n",
        "\n",
        "## Vorbereitende Schritte\n",
        "\n",
        "Einige der Code-Beispiele auf dieser Seite verwenden `samplex`, das zum Samplomatic-Paket gehört.  Bevor Sie diese Code-Blöcke ausführen, müssen Sie daher Samplomatic installieren, wie im folgenden Code-Block gezeigt.  Weitere Informationen finden Sie in der [Samplomatic-Dokumentation](https://qiskit.github.io/samplomatic).\n",
        "\n",
        "```python\n",
        "pip install samplomatic\n",
        "\n",
        "# For visualization support, include the visualization dependencies.\n",
        "# pip install samplomatic[vis]\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9112ddbd-7101-4cac-a53f-5ecf492bc8d4",
      "metadata": {},
      "source": [
        "<span id=\"steps-to-use-the-executor-primitive\" />\n",
        "\n",
        "## Schritte zur Verwendung der Executor-Primitive\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. Das Konto einrichten\n",
        "\n",
        "Da es sich bei „ IBM Quantum Compute Service“ um einen verwalteten Dienst handelt, müssen Sie zunächst Ihr Konto einrichten. Anschließend können Sie die QPU auswählen, die Sie zur Berechnung des Erwartungswerts verwenden möchten.\n",
        "\n",
        "Befolgen Sie die Schritte unter „[ IBM Cloud® -Konto einrichten](/docs/guides/cloud-setup) “, falls Sie noch kein Konto haben.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "c0b08867-a635-481e-ac4f-52359382c94d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService, Executor\n",
        "from qiskit_ibm_runtime.quantum_program import QuantumProgram\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from samplomatic.transpiler import generate_boxing_pass_manager\n",
        "from samplomatic import build\n",
        "\n",
        "# Initialize the service and choose a backend\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "ec105ea7-d806-4333-92af-2d7c578c67d9",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "<IBMBackend('ibm_fez')>\n"
          ]
        }
      ],
      "source": [
        "print(backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "89c4ffd9-acde-4b1f-8ada-fc39b7a708ed",
      "metadata": {},
      "source": [
        "<span id=\"2-create-and-transpile-a-circuit\" />\n",
        "\n",
        "### 2. Einen Schaltkreis erstellen und transpilieren\n",
        "\n",
        "Sie benötigen mindestens einen Schaltkreis, um die Executor-Primitive nutzen zu können.  Sie kann optional Parameter enthalten.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "7671b4dd-b031-44b7-bd4a-48dd39fb93f4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Generate the circuit\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.h(1)\n",
        "circuit.cz(0, 1)\n",
        "circuit.h(1)\n",
        "\n",
        "# Using `measure_all` automatically creates the necessary\n",
        "# classical registers.\n",
        "circuit.measure_all()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "127d6de9-084e-47d5-82d6-f2197c0bd74c",
      "metadata": {},
      "source": [
        "Die Schaltung muss so umgestaltet werden, dass sie ausschließlich Befehle verwendet, die von der QPU unterstützt werden (sogenannte *ISA* -Schaltungen, d. h. Schaltungen mit Befehlssatzarchitektur). Verwenden Sie dazu den Transpiler.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "7a98fb20-8731-43f3-a81c-fb2bc8cba9db",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Transpile the circuit\n",
        "preset_pass_manager = generate_preset_pass_manager(\n",
        "    backend=backend, optimization_level=0\n",
        ")\n",
        "isa_circuit = preset_pass_manager.run(circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "172b3622-adbb-43f6-9cec-b70dc72094e0",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-a-quantumprogram\" />\n",
        "\n",
        "### 3. Initialisiere ein ` `QuantumProgram` `\n",
        "\n",
        "Initialisieren Sie ein `QuantumProgram` mit Ihrer Arbeitslast. A `QuantumProgram` besteht aus `QuantumProgramItems`. In der Regel besteht jedes Element aus einer Schaltung, einer Reihe von Parameterwerten und gegebenenfalls einer Funktion `samplex` zur Randomisierung des Schaltungsinhalts. Ausführliche Informationen finden Sie unter „[Eingaben und Ausgaben des Executors](/docs/guides/executor-input-output) “.\n",
        "\n",
        "Die folgende Zelle initialisiert ein `QuantumProgram` und legt fest, dass 25 Schüsse ausgeführt werden sollen. Anschließend fügt es die transpilierte Zielschaltung an.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "eb6719cf-c7f1-4265-8602-9a65071a2dd5",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Initialize an empty program\n",
        "program = QuantumProgram(shots=25)\n",
        "\n",
        "# Append the circuit to the program\n",
        "program.append_circuit_item(isa_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da542e9b-f143-4651-ab3d-86fb54c066ab",
      "metadata": {},
      "source": [
        "<span id=\"4-optional-group-gates-and-measurements-into-annotated-boxes\" />\n",
        "\n",
        "### 4. Optional: Gruppieren Sie Tore und Messungen in beschrifteten Rahmen\n",
        "\n",
        "Das Zusammenfassen von Anweisungen in Blöcken und das Hinzufügen von Anmerkungen ist die wichtigste Methode, um Ihre Absicht zu verdeutlichen. Im folgenden Beispiel verwenden `generate_boxing_pass_manager` wir und seine Twirling-Parameter, um Zwei-Qubit-Gatter und Messungen in Kästchen zu gruppieren und eine Twirling-Annotation anzuwenden.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "245a4574-3ce9-4f77-98c8-af32cde8ac01",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/get-started-with-executor/extracted-outputs/245a4574-3ce9-4f77-98c8-af32cde8ac01-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Generate a boxing pass manager to group gates\n",
        "# and measurements into boxes and add\n",
        "# a`Twirl` annotation.\n",
        "boxes_pm = generate_boxing_pass_manager(\n",
        "    # Add gate twirling\n",
        "    enable_gates=True,\n",
        "    # Add measurement twirling\n",
        "    enable_measures=True,\n",
        ")\n",
        "\n",
        "boxed_circuit = boxes_pm.run(isa_circuit)\n",
        "boxed_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b2fe4a7-2a1c-489e-9063-3084edfc2517",
      "metadata": {},
      "source": [
        "<span id=\"5-optional-build-a-template-circuit-and-samplex-and-add-them-to-the-program\" />\n",
        "\n",
        "### 5. Optional: Erstelle eine Schaltungsvorlage und ein Samplex und füge sie dem Programm hinzu\n",
        "\n",
        "Verwenden Sie anschließend die [Samplomatic-Erstellungsmethode](/docs/api/samplomatic/auto/build#samplomatic.build), um die *Schaltungsvorlage* und das *Samplex* -Paar zu generieren. Die Vorlagenschaltung entspricht strukturell der Originalschaltung. Allerdings werden die Einzel-Qubit-Gatter durch parametrisierte Gatter ersetzt, um die vorgegebenen Annotationen (in diesem Beispiel Gatter- und Messungs-Twirling) zu implementieren. Der Samplex enthält alle Informationen, die zur Erzeugung zufälliger Parameter für die Vorlagenschaltung erforderlich sind.\n",
        "\n",
        "Nachdem Sie die Vorlagenschaltung und das Samplex-Paar erstellt haben, fügen Sie das Paar mithilfe der `append_samplex_item` Methode zum Programm hinzu.\n",
        "\n",
        "Ausführliche Informationen zu und `samplomatic.samplex.Samplex` seinen Argumenten finden Sie in der [Samplomatic-API-Dokumentation](/docs/api/samplomatic/index).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "47bbeef2-2d85-4495-b740-2e64eb9066b7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Build the template circuit and the samplex\n",
        "template_circuit, samplex = build(boxed_circuit)\n",
        "\n",
        "# Append the template circuit and samplex as a `samplex_item`\n",
        "program.append_samplex_item(\n",
        "    template_circuit,\n",
        "    samplex=samplex,\n",
        "    shape=(num_randomizations := 20,),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3733cce7-15d5-4c04-a1cd-0bf83e94aeaf",
      "metadata": {},
      "source": [
        "<span id=\"6-invoke-executor-and-get-results\" />\n",
        "\n",
        "### 6. Executor aufrufen und Ergebnisse abrufen\n",
        "\n",
        "Führen Sie das Programm `QuantumProgram` auf einem „ IBM® “-Backend aus, indem Sie die `Executor` Primitive mit den Standardoptionen verwenden. Weitere Informationen zu den verfügbaren Optionen finden Sie unter „[Executor-Optionen](/docs/guides/executor-options) “.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "b767050c-0299-4100-8be4-b73b0587e088",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<RuntimeJobV2('dab7lcrvpcac73ddek40', 'executor')>"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Initialize an Executor with the default options\n",
        "executor = Executor(mode=backend)\n",
        "\n",
        "# Submit the job\n",
        "job = executor.run(program)\n",
        "job"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "a341681d-0704-4800-af65-e49b7627bb36",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Retrieve the result\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e649245b-633d-4123-ad55-9971b9366433",
      "metadata": {},
      "source": [
        "Das Ergebnis ist vom Typ [`QuantumProgramResult`](/docs/api/qiskit-ibm-runtime/results-quantum-program-result). Weitere Informationen zum Ergebnisobjekt finden Sie unter „[Executor-Ein- und -Ausgabe](/docs/guides/executor-input-output) “.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6e149b1-de4f-41bb-b972-0781f082fa45",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Probieren Sie einige [Executor-Beispiele](/docs/guides/executor-examples) aus.\n",
        "  * [Die Ein- und Ausgabe von Executor](/docs/guides/executor-input-output) verstehen.\n",
        "  * Erfahren Sie mehr über [die Semantik der Executor-Übertragung](/docs/guides/executor-broadcasting).\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}