{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "fbce2fd6-c79e-4e90-9074-6cde8a09b517",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Häufig verwendete Parameter für die Transpilierung\"\n",
        "description: \"Übersicht über häufig verwendete Parameter zur Steuerung der Transpilation von Quantenschaltungen in Qiskit.\"\n",
        "---\n",
        "\n",
        "<span id=\"commonly-used-parameters-for-transpilation\" />\n",
        "\n",
        "# Häufig verwendete Parameter für die Transpilierung\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6beea7ff-7407-47be-a0b7-1e7981328df5",
      "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": "05fb8adb-3b36-4449-b669-108d2d749ca5",
      "metadata": {},
      "source": [
        "Auf dieser Seite werden einige der am häufigsten verwendeten Parameter für die lokale Transpilation beschrieben. Diese Parameter werden mit Argumenten für [`generate_preset_pass_manager`](/docs/api/qiskit/qiskit.transpiler.generate_preset_pass_manager#qiskit.transpiler.generate_preset_pass_manager) oder [`transpile`](/docs/api/qiskit/compiler#qiskit.compiler.transpile).\n",
        "\n",
        "<span id=\"approx-degree\" />\n",
        "\n",
        "<span id=\"approximation-degree\" />\n",
        "\n",
        "## Näherungsgrad\n",
        "\n",
        "Mit dem Näherungsgrad können Sie angeben, wie genau die resultierende Schaltung der gewünschten (Eingangs-)Schaltung entsprechen soll.  Hierbei handelt es sich um eine Fließkommazahl im Bereich ( 0.0 - 1.0 ), wobei 0.0 für die maximale Annäherung und 1.0 (Standard) für keine Annäherung steht. Bei kleineren Werten wird die Genauigkeit der Ausgabe gegen die Einfachheit der Ausführung (d. h. weniger Gatter) eingetauscht.  Der Standardwert ist 1,0.\n",
        "\n",
        "Bei der unitären Zweibit-Synthese (die in den Anfangsphasen aller Stufen und in der Optimierungsphase mit Optimierungsstufe 3 verwendet wird) gibt dieser Wert die angestrebte Treue der Ausgangszerlegung an. Das heißt, wie viel Fehler wird eingeführt, wenn eine Matrixdarstellung einer Schaltung in diskrete Gatter umgewandelt wird. Ist der Approximationsgrad niedriger (mehr Approximation), weicht die Ausgangsschaltung der Synthese stärker von der Eingabematrix ab, hat aber wahrscheinlich auch weniger Gatter (weil jede beliebige Zwei-Qubit-Operation mit höchstens drei CX-Gattern perfekt zerlegt werden kann) und ist einfacher zu betreiben.\n",
        "\n",
        "Wenn der Approximationsgrad kleiner als 1.0 ist, können Schaltungen mit einem oder zwei CX-Gattern synthetisiert werden, was zu weniger Fehlern in der Hardware, aber zu mehr Fehlern in der Approximation führt. Da CX das teuerste Gatter in Bezug auf Fehler ist, könnte es von Vorteil sein, die Anzahl der Gatter auf Kosten der Genauigkeit der Synthese zu verringern (diese Technik wurde zur Erhöhung des Quantenvolumens auf IBM® verwendet): [Validierung von Quantencomputern mit randomisierten Modellschaltungen](https://arxiv.org/abs/1811.12926) ).\n",
        "\n",
        "Als Beispiel generieren wir ein zufälliges Zwei-Qubit `UnitaryGate` , das in der Anfangsphase synthetisiert wird. Wenn Sie `approximation_degree` kleiner als 1.0 einstellen, können Sie eine ungefähre Schaltung erzeugen. Wir müssen auch die `basis_gates` angeben, damit die Synthesemethode weiß, welche Gatter sie für die approximative Synthese verwenden kann.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e660bec2-f806-4050-955b-53a50289158e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "2\n"
          ]
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit.library import UnitaryGate\n",
        "from qiskit.quantum_info import random_unitary\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "UU = random_unitary(4, seed=12345)\n",
        "rand_U = UnitaryGate(UU)\n",
        "\n",
        "qubits = QuantumRegister(2, name=\"q\")\n",
        "qc = QuantumCircuit(qubits)\n",
        "qc.append(rand_U, qubits)\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1,\n",
        "    approximation_degree=0.85,\n",
        "    basis_gates=[\"sx\", \"rz\", \"cx\"],\n",
        ")\n",
        "approx_qc = pass_manager.run(qc)\n",
        "print(approx_qc.count_ops()[\"cx\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f067d6e-0157-43fc-8cb2-c86855b6bdac",
      "metadata": {},
      "source": [
        "Dies führt zu einer Ausgabe von `2` , da die Annäherung weniger CX-Gatter erfordert.\n",
        "\n",
        "<span id=\"seed\" />\n",
        "\n",
        "<span id=\"random-number-generator-seed\" />\n",
        "\n",
        "## Startwert für Zufallszahlengenerator\n",
        "\n",
        "Einige Teile des Transpilers sind stochastisch, so dass wiederholte Transpilierungsläufe unterschiedliche Ergebnisse liefern können. Um ein reproduzierbares Ergebnis zu erhalten, können Sie den Seed für den Pseudozufallszahlengenerator mit dem Argument `seed_transpiler` festlegen. Wiederholte Durchläufe mit demselben Seed führen zu denselben Ergebnissen.\n",
        "\n",
        "Beispiel:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/dbc652e8-53a4-47a9-a66e-d9c1e5ef07c9-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, seed_transpiler=11, basis_gates=[\"sx\", \"rz\", \"cx\"]\n",
        ")\n",
        "optimized_1 = pass_manager.run(qc)\n",
        "optimized_1.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "20b95efa-8aa8-41ac-a037-dac2a3336879",
      "metadata": {},
      "source": [
        "<span id=\"init-layout\" />\n",
        "\n",
        "<span id=\"initial-layout\" />\n",
        "\n",
        "## Anfängliches Layout\n",
        "\n",
        "Vor der Transpilierung sind die in Ihrem Schaltkreis enthaltenen Qubits virtuelle Qubits, die nicht notwendigerweise den physischen Qubits auf dem Ziel-Backend entsprechen. Sie können die anfängliche Zuordnung von virtuellen Qubits zu physischen Qubits mit dem Argument `initial_layout` angeben. Beachten Sie, dass das endgültige Qubit-Layout vom anfänglichen Layout abweichen kann, da der Transpiler Qubits mit Hilfe von Swap-Gates oder anderen Mitteln vertauschen kann.\n",
        "\n",
        "Im folgenden Beispiel konstruieren wir ein erstes Layout für das [`FakeSherbrooke`](/docs/api/qiskit-ibm-runtime/fake-provider-fake-sherbrooke#fakesherbrooke) mock-Backend durch Erstellen eines [`Layout`](/docs/api/qiskit/qiskit.transpiler.Layout) objekt. Unser Layout ordnet das erste Qubit unserer Schaltung dem Qubit 5 von Sherbrooke zu, und es ordnet das zweite Qubit unserer Schaltung dem Qubit 6 von Sherbrooke zu. Beachten Sie, dass physikalische Qubits immer durch ganze Zahlen dargestellt werden.\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": 3,
      "id": "e18c034c-eb26-4d9d-81d7-37e0eafa17c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/e18c034c-eb26-4d9d-81d7-37e0eafa17c7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_runtime.fake_provider import FakeSherbrooke\n",
        "from qiskit.transpiler import Layout\n",
        "\n",
        "backend = FakeSherbrooke()\n",
        "\n",
        "a, b = qubits\n",
        "initial_layout = Layout({a: 5, b: 6})\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "261055f3-cb88-4651-9a98-31891a4db535",
      "metadata": {},
      "source": [
        "Zusätzlich zur Angabe eines Layout-Objekts können Sie auch eine Liste von Ganzzahlen übergeben, wobei das $i$ -te Element der Liste das physikalische Qubit enthält, auf das das $i$ -te Qubit abgebildet werden soll. Zum Beispiel:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "a7800d8a-7354-48e4-a55f-f902ae28c875",
      "metadata": {
        "scrolled": true
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/a7800d8a-7354-48e4-a55f-f902ae28c875-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "initial_layout = [5, 6]\n",
        "\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    optimization_level=1, backend=backend, initial_layout=initial_layout\n",
        ")\n",
        "transpiled_circ = pass_manager.run(qc)\n",
        "\n",
        "transpiled_circ.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d2034dd5-23e5-4473-89b8-aaf4233775c7",
      "metadata": {},
      "source": [
        "Sie können mit der Funktion [`plot_error_map`](/docs/api/qiskit/qiskit.visualization.plot_error_map) funktion können Sie ein Diagramm des Gerätegraphen mit Fehlerinformationen und der Beschriftung der physikalischen Qubits erstellen. Ähnliche Diagramme können Sie auch auf der Seite [Compute-Ressourcen](/computers) einsehen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "8df57c6a-1ff4-4d58-9b7e-4378452c3025",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/common-parameters/extracted-outputs/8df57c6a-1ff4-4d58-9b7e-4378452c3025-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_error_map\n",
        "\n",
        "plot_error_map(backend, figsize=(30, 24))"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "25c05cca-b93b-4ba1-b46c-7280ec4ef8cb",
      "metadata": {},
      "source": [
        "<span id=\"xx-method\" />\n",
        "\n",
        "<span id=\"transpiler-stage-and-plugin-options\" />\n",
        "\n",
        "## Transpiler-Stufe und Plugin-Optionen\n",
        "\n",
        "Diese Optionen sind mit dem Suffix `_method` versehen. Sie beeinflussen die Arbeitsweise des Transpilers und werden verwendet, um eine bessere, andere oder spezifische Ausgabe des Transpilers zu erhalten.\n",
        "\n",
        "* `init_method` (str) - Das Plugin, das für die Initialisierungsphase verwendet werden soll.\n",
        "\n",
        "* `layout_method` (str) - Der Layout-Auswahldurchgang (`trivial`, `dense`, `sabre`). Dies kann auch der Name des externen Plugins sein, das für die Layoutphase verwendet werden soll.\n",
        "\n",
        "* `optimization_method` (str) - Das Plugin, das für die Optimierungsphase verwendet werden soll.\n",
        "\n",
        "* `routing_method` (str) - Name des Routing-Durchgangs (`basic`, `lookahead`, `default`, `sabre`, `none`). Dies kann auch der Name des externen Plugins sein, das für die Weiterleitungsstufe verwendet werden soll.\n",
        "\n",
        "* `scheduling_method` (str) - Name des Zeitplanungsdurchlaufs. Dies kann auch der Name des externen Plugins sein, das für die Planungsphase verwendet wird.\n",
        "  * `as_soon_as_possible`: Anweisungen gierig einplanen: so früh wie möglich auf einer Qubit-Ressource (alias: `asap`).\n",
        "  * `as_late_as_possible`: Anweisungen zu spät einplanen.  Das heißt, die Qubits sollten möglichst im Grundzustand bleiben (alias: `alap`).\n",
        "\n",
        "* `translation_method` (str) - Name der Übersetzungsstufe (`unroller`, `translator`, `synthesis`). Dies kann auch der Name des externen Plugins sein, das für die Übersetzungsphase verwendet wird.\n",
        "\n",
        "* `unitary_synthesis_method` (str) - Der Name der zu verwendenden unitären Synthesemethode. Standardmäßig wird `default` verwendet.\n",
        "\n",
        "<Admonition>\n",
        "  Um eine Liste aller installierten Plugins für eine bestimmte Stufe anzuzeigen, führen Sie [`list_stage_plugins(\"stage_name\")`](/docs/api/qiskit/transpiler_plugins). Wenn Sie zum Beispiel eine Liste aller installierten Plugins für die Routing-Stufe sehen möchten, führen Sie `list_stage_plugins(routing)` aus.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlung\">\n",
        "  * Lesen Sie das Thema [Standardoptionen und Konfigurationseinstellungen](defaults-and-configuration-options).\n",
        "  * Erfahren Sie, wie Sie [den Optimierungsgrad einstellen](set-optimization).\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": {
    "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": 5
}