{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "58b0ed8c-a233-4d70-9127-b740c757955f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Transpilieren mit Pass-Managern\"\n",
        "description: \"Wie man Quantenschaltungen mit Pass-Managern in Qiskit transpiliert.\"\n",
        "---\n",
        "\n",
        "<span id=\"transpile-with-pass-managers\" />\n",
        "\n",
        "# Transpilieren mit Pass-Managern\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a6414f1d-e0c5-4022-b297-719ea5958842",
      "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 die Verwendung dieser oder neuerer Versionen.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    qiskit-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d93f555a-6238-4660-91b5-181ae0da4a53",
      "metadata": {},
      "source": [
        "Es wird empfohlen, einen Schaltkreis zu transpilieren, indem man einen gestuften Passmanager erstellt und dann dessen Methode `run` mit dem Schaltkreis als Eingabe ausführt. Auf dieser Seite wird erklärt, wie man Quantenschaltungen auf diese Weise transpilieren kann.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "47730af4-67a2-44b4-a304-224296926799",
      "metadata": {},
      "source": [
        "<span id=\"what-is-a-staged-pass-manager\" />\n",
        "\n",
        "## Was ist ein (gestufter) Passmanager?\n",
        "\n",
        "Im Zusammenhang mit dem Qiskit SDK bezieht sich die Transpilierung auf den Prozess der Umwandlung einer Eingabeschaltung in eine Form, die für die Ausführung auf einem Quantengerät geeignet ist. Die Transpilierung erfolgt in der Regel in einer Abfolge von Schritten, den so genannten Transpilerdurchläufen. Die Schaltung wird von jedem Transpiler-Durchgang nacheinander bearbeitet, wobei der Ausgang eines Durchgangs der Eingang für den nächsten ist. Beispielsweise könnte ein Durchgang die Schaltung durchlaufen und alle aufeinanderfolgenden Sequenzen von Ein-Qubit-Gattern zusammenführen, und der nächste Durchgang könnte diese Gatter dann in die Basismenge des Zielbauelements synthetisieren. Die in Qiskit enthaltenen Transpilerpässe befinden sich im [qiskit.transpiler.passes](/docs/api/qiskit/transpiler_passes) modul.\n",
        "\n",
        "Ein Pass-Manager ist ein Objekt, das eine Liste von Transpiler-Pässen speichert und diese auf einer Schaltung ausführen kann. Erstellen Sie einen Passmanager, indem Sie eine [`PassManager`](/docs/api/qiskit/qiskit.transpiler.PassManager) mit einer Liste von Transpilerpässen initialisiert. Um die Transpilation für einen Stromkreis durchzuführen, rufen Sie die Methode [`run`](/docs/api/qiskit/qiskit.transpiler.PassManager#run) methode mit einer Schaltung als Eingabe auf.\n",
        "\n",
        "Ein gestufter Passmanager ist eine besondere Art von Passmanager, der eine höhere Abstraktionsebene als ein normaler Passmanager darstellt. Während ein normaler Passmanager aus mehreren Transpilerpässen besteht, setzt sich ein gestufter Passmanager aus mehreren *Passmanagern* zusammen. Dies ist eine nützliche Abstraktion, da die Transpilierung typischerweise in diskreten Stufen erfolgt, wie in [Transpiler-Stufen](transpiler-stages) beschrieben, wobei jede Stufe durch einen Passmanager repräsentiert wird. Staged Pass Manager werden durch die Klasse [`StagedPassManager`](/docs/api/qiskit/qiskit.transpiler.StagedPassManager) klasse. Im weiteren Verlauf dieser Seite wird beschrieben, wie Sie (abgestufte) Passmanager erstellen und anpassen können.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9d1aaab0-e9e9-4066-9a9a-f551fdc410b9",
      "metadata": {},
      "source": [
        "<span id=\"generate-a-preset-staged-pass-manager\" />\n",
        "\n",
        "## Voreingestellten Staged Pass Manager generieren\n",
        "\n",
        "Um einen voreingestellten Staged-Pass-Manager mit sinnvollen Standardwerten zu erstellen, verwenden Sie die [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) Funktion.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  In diesen Beispielen wird das `FakeSherbrooke``qiskit_ibm_runtime` Mock-Backend von verwendet, Sie können es jedoch mit jedem Qiskit-kompatiblen echten oder simulierten Backend ausprobieren.  Ihre Ergebnisse können davon abweichen.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "293c1f9f-f9da-4c60-b456-80fea88b1194",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7796dd8b-5f42-4712-bcd8-ebff5096c5f1",
      "metadata": {},
      "source": [
        "Um einen Stromkreis oder eine Liste von Stromkreisen mit einem Passmanager zu übertragen, übergeben Sie den Stromkreis oder die Liste von Stromkreisen an die Methode `run` . Wir wollen dies an einer Zwei-Qubit-Schaltung ausprobieren, die aus einem Hadamard- und zwei benachbarten CX-Gattern besteht:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "c1426e6c-f506-4938-8c0a-05198bae9746",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpile-with-pass-managers/extracted-outputs/c1426e6c-f506-4938-8c0a-05198bae9746-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumRegister, QuantumCircuit\n",
        "\n",
        "# Create a circuit\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "circuit = QuantumCircuit(qubits)\n",
        "a, b = qubits\n",
        "circuit.h(a)\n",
        "circuit.cx(a, b)\n",
        "circuit.cx(b, a)\n",
        "\n",
        "# Transpile it by calling the run method of the pass manager\n",
        "transpiled = pass_manager.run(circuit)\n",
        "\n",
        "# Draw it, excluding idle qubits from the diagram\n",
        "transpiled.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9568b846-12b9-4de0-88a7-594d14312db4",
      "metadata": {},
      "source": [
        "Eine Beschreibung der möglichen Argumente für die Funktion `generate_preset_pass_manager` finden Sie unter [Standardeinstellungen und Konfigurationsoptionen für die Transpilierung](defaults-and-configuration-options). Die Argumente für `generate_preset_pass_manager` entsprechen den Argumenten für die [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile) funktion.\n",
        "\n",
        "Wenn die voreingestellten Passmanager Ihren Anforderungen nicht genügen, können Sie die Transpilierung anpassen, indem Sie (abgestufte) Passmanager oder sogar Transpilierungspässe erstellen. Im weiteren Verlauf dieser Seite wird beschrieben, wie Sie Passmanager erstellen. Anleitungen zum Erstellen von Transpilierpässen finden Sie unter [Schreiben Sie Ihren eigenen Transpilierpass](custom-transpiler-pass).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a6d45c6-1d88-4566-92f2-0ae149c606fa",
      "metadata": {},
      "source": [
        "<span id=\"create-your-own-pass-manager\" />\n",
        "\n",
        "## Erstellen Sie Ihren eigenen Pass-Manager\n",
        "\n",
        "Das [qiskit.transpiler.passes](/docs/api/qiskit/transpiler_passes) modul enthält viele Transpilerpässe, die zur Erstellung von Pass-Managern verwendet werden können. Um einen Passmanager zu erstellen, initialisieren Sie eine `PassManager` mit einer Liste von Pässen. Der folgende Code erzeugt beispielsweise einen Transpiler-Durchgang, der benachbarte Zwei-Qubit-Gatter zusammenführt und sie dann zu einer Basis von [$R_y$](/docs/api/qiskit/qiskit.circuit.library.RYGate), [$R_z$](/docs/api/qiskit/qiskit.circuit.library.RZGate), und [$R_{xx}$](/docs/api/qiskit/qiskit.circuit.library.RXXGate) gattern synthetisiert.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "054a634f-958a-49e3-81d5-c53257e25b65",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import PassManager\n",
        "from qiskit.transpiler.passes import (\n",
        "    Collect2qBlocks,\n",
        "    ConsolidateBlocks,\n",
        "    UnitarySynthesis,\n",
        ")\n",
        "\n",
        "basis_gates = [\"rx\", \"ry\", \"rxx\"]\n",
        "translate = PassManager(\n",
        "    [\n",
        "        Collect2qBlocks(),\n",
        "        ConsolidateBlocks(basis_gates=basis_gates),\n",
        "        UnitarySynthesis(basis_gates),\n",
        "    ]\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a93ff400-d04e-4aa1-9a70-4f583425cc3c",
      "metadata": {},
      "source": [
        "Um diesen Passmanager in Aktion zu demonstrieren, testen Sie ihn an einer Zwei-Qubit-Schaltung, die aus einem Hadamard- und zwei benachbarten CX-Gattern besteht:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "01317c54-68b5-4e41-893f-82ee223e22f0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpile-with-pass-managers/extracted-outputs/01317c54-68b5-4e41-893f-82ee223e22f0-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumRegister, QuantumCircuit\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "circuit = QuantumCircuit(qubits)\n",
        "\n",
        "a, b = qubits\n",
        "circuit.h(a)\n",
        "circuit.cx(a, b)\n",
        "circuit.cx(b, a)\n",
        "\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1a852fa1-6fe0-42b7-b6ad-26c29e844a3a",
      "metadata": {},
      "source": [
        "Um den Passmanager auf dem Stromkreis laufen zu lassen, rufen Sie die Methode `run` auf.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "019ad99b-bd38-4217-90ee-da43959dc8ad",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/transpile-with-pass-managers/extracted-outputs/019ad99b-bd38-4217-90ee-da43959dc8ad-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "translated = translate.run(circuit)\n",
        "translated.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bc0944c9-b25f-4efe-a6ab-9ae4b5b27976",
      "metadata": {},
      "source": [
        "Ein fortgeschrittenes Beispiel, das zeigt, wie man einen Durchlaufmanager erstellt, um die als dynamische Entkopplung bekannte Fehlerunterdrückungstechnik zu implementieren, finden Sie unter [Erstellen eines Durchlaufmanagers für dynamische Entkopplung](dynamical-decoupling-pass-manager).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0abb7cb1-3a5e-42c1-9817-f2838ad98b98",
      "metadata": {},
      "source": [
        "<span id=\"create-a-staged-pass-manager\" />\n",
        "\n",
        "## Erstellen Sie einen gestaffelten Pass-Manager\n",
        "\n",
        "Ein `StagedPassManager` ist ein Passmanager, der aus einzelnen Stufen besteht, wobei jede Stufe durch eine `PassManager` Instanz definiert ist. Sie können eine `StagedPassManager` erstellen, indem Sie die gewünschten Stufen angeben. Der folgende Code erstellt zum Beispiel einen gestuften Passmanager mit zwei Stufen, `init` und `translation`. Die Stufe `translation` wird durch den zuvor erstellten Passmanager definiert.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "8f1c1a26-b6bc-470c-9b8a-7f9d53db8b01",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.transpiler import PassManager, StagedPassManager\n",
        "from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore\n",
        "\n",
        "basis_gates = [\"rx\", \"ry\", \"rxx\"]\n",
        "init = PassManager(\n",
        "    [UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]\n",
        ")\n",
        "staged_pm = StagedPassManager(\n",
        "    stages=[\"init\", \"translation\"], init=init, translation=translate\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "45d3105f-e852-4571-b221-70bf517ff519",
      "metadata": {},
      "source": [
        "Es gibt keine Begrenzung für die Anzahl der Etappen, die Sie in einen Etappenpass-Manager eingeben können.\n",
        "\n",
        "Eine weitere nützliche Methode zur Erstellung eines gestaffelten Pass-Managers besteht darin, mit einem voreingestellten gestaffelten Pass-Manager zu beginnen und dann einige der Stufen auszutauschen. Der folgende Code erzeugt beispielsweise einen voreingestellten Passmanager mit Optimierungsstufe 3 und gibt dann eine benutzerdefinierte `pre_layout` Stufe an.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "2a2b86b9-f46a-460b-b2d6-5962cffeec01",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate\n",
        "from qiskit.transpiler.passes import InverseCancellation\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(3, backend)\n",
        "inverse_gate_list = [\n",
        "    HGate(),\n",
        "    (RXGate(np.pi / 4), RXGate(-np.pi / 4)),\n",
        "    (PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),\n",
        "    (TGate(), TdgGate()),\n",
        "]\n",
        "logical_opt = PassManager(\n",
        "    [\n",
        "        InverseCancellation(inverse_gate_list),\n",
        "    ]\n",
        ")\n",
        "\n",
        "# Add pre-layout stage to run extra logical optimization\n",
        "pass_manager.pre_layout = logical_opt"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9d49e4a5-2868-4f09-85f8-a0b89f35338c",
      "metadata": {},
      "source": [
        "Die [Funktionen des Stufengenerators](/docs/api/qiskit/transpiler_preset#stage-generator-functions) können für die Erstellung von benutzerdefinierten Pass-Managern nützlich sein.\n",
        "Sie erzeugen Stufen, die gemeinsame Funktionen für viele Passmanager bieten.\n",
        "Zum Beispiel, [`generate_embed_passmanager`](/docs/api/qiskit/transpiler_preset#qiskit.transpiler.preset_passmanagers.generate_embed_passmanager) verwendet werden, um eine Stufe zu erzeugen zum \"Einbetten\" einer ausgewählten Ausgangsdatei `Layout` aus einem Layout-Durchgang in das angegebene Zielgerät.\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlung\">\n",
        "  * [Schreiben Sie einen benutzerdefinierten Transpiler-Pass](custom-transpiler-pass).\n",
        "  * [Erstellen Sie einen Passmanager für die dynamische Entkopplung](dynamical-decoupling-pass-manager).\n",
        "  * Weitere Informationen zur Funktion `generate_preset_passmanager` finden Sie unter dem Thema [Transpilations-Standardeinstellungen und Konfigurationsoptionen](defaults-and-configuration-options).\n",
        "  * Probieren Sie die Anleitung [zum Vergleichen der Transpiler-Einstellungen](/docs/guides/circuit-transpilation-settings) aus.\n",
        "  * Lesen Sie [die Dokumentation zur Transpiler-API.](/docs/api/qiskit/transpiler)\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "celltoolbar": "Raw Cell Format",
    "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
}