{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "c08a245a-82c1-4c6f-b1e1-d0a27f093b7a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Lokaler Testmodus\"\n",
        "description: \"Verwenden Sie den lokalen Testmodus, um Quantenhardware mit „ IBM Quantum Compute“ zu simulieren\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore superop */}\n",
        "\n",
        "<span id=\"test-locally\" />\n",
        "\n",
        "<span id=\"local-testing-mode\" />\n",
        "\n",
        "# Lokaler Testmodus\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "14778d9c-4e0e-4b84-8575-90e4efab25a2",
      "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",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "435ec827-a348-4b70-b1ef-582849c0a76a",
      "metadata": {},
      "source": [
        "Verwenden Sie den lokalen Testmodus (verfügbar ab `qiskit-ibm-runtime` v0.22.0 ), um Programme zu testen, bevor Sie sie feinabstimmen und an echte Quantenhardware senden.  Nachdem Sie Ihr Programm im lokalen Testmodus überprüft haben, müssen Sie nur noch den Namen des Backends ändern, um es auf einer QPU auszuführen.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Die Unterstützung des lokalen Modus für die Executor-Primitive wurde in `qiskit-ibm-runtime` „ v0.50.0 “ eingeführt.\n",
        "</Admonition>\n",
        "\n",
        "Um den lokalen Testmodus zu verwenden, geben Sie eines der simulierten Backends aus an oder `qiskit_ibm_runtime.fake_provider` legen Sie beim Instanziieren einer „ IBM Quantum® “-Primitive oder einer Sitzung ein Qiskit Aer-Backend fest.\n",
        "\n",
        "* **Gefälschte Backends** : Die [gefälschten Backends](/docs/api/qiskit-ibm-runtime/fake-provider) in `qiskit_ibm_runtime.fake_provider` imitieren das Verhalten von IBM® QPUs, indem sie QPU-Snapshots verwenden. Die QPU-Snapshots enthalten wichtige Informationen über die QPU, wie z. B. die Kopplungskarte, Basisgatter und Qubit-Eigenschaften, die für das Testen des Transpilers und die Durchführung von verrauschten Simulationen der QPU nützlich sind. Das Rauschmodell aus dem Schnappschuss wird bei der Simulation automatisch angewendet.\n",
        "* **Aer-Simulator** : Die Simulatoren von [Qiskit Aer](/docs/guides/simulate-with-qiskit-aer) bieten eine leistungsstärkere Simulation, die größere Schaltungen und [benutzerdefinierte Rauschmodelle](/docs/guides/build-noise-models) verarbeiten kann. Eine Liste von Simulationsmethoden ist verfügbar, wenn Sie `AerSimulator` im lokalen Testmodus verwenden. Siehe das [Beispiel für den Clifford-Simulationsmodus](#clifford-sim), das zeigt, wie man Clifford-Schaltungen mit einer großen Anzahl von Qubits effizient simulieren kann.\n",
        "\n",
        "  <Accordion>\n",
        "    <AccordionItem title=\"**Liste der in Qiskit Aer verfügbaren Simulationsmethoden**\">\n",
        "      Weitere Informationen finden Sie in der [`AerSimulator`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) dokumentation für weitere Informationen.\n",
        "\n",
        "      * `\"automatic\"`: Standard-Simulationsmethode. Wählen Sie die Simulationsmethode automatisch auf der Grundlage des Schaltungs- und Rauschmodells.\n",
        "\n",
        "      * `\"statevector\"`: Eine dichte Zustandsvektorsimulation, die Messergebnisse von *idealen* Schaltkreisen mit allen Messungen am Ende des Schaltkreises erfassen kann. Bei verrauschten Simulationen wird bei jedem Schuss ein zufällig abgetasteter verrauschter Schaltkreis aus dem Rauschmodell abgetastet.\n",
        "\n",
        "      * `\"density_matrix\"`: Eine Dichtematrixsimulation, die Messergebnisse von *verrauschten* Schaltkreisen mit allen Messungen am Ende des Schaltkreises erfassen kann.\n",
        "\n",
        "      * `\"stabilizer\"`: Ein effizienter Clifford-Stabilisator-Zustandssimulator, der verrauschte Clifford-Schaltungen simulieren kann, wenn alle Fehler im Rauschmodell auch Clifford-Fehler sind.\n",
        "\n",
        "      * `\"extended_stabilizer\"`: Ein annähernder Simulator für Clifford + T-Schaltungen, der auf der Zerlegung des Zustands in einen Rang-Stabilisator-Zustand beruht. Die Anzahl der Terme wächst mit der Anzahl der Nicht-Clifford (T)-Gatter.\n",
        "\n",
        "      * `\"matrix_product_state\"`: Ein Tensornetz-Zustandsvektor-Simulator, der eine Matrix-Produkt-Zustandsdarstellung (MPS) für den Zustand verwendet. Je nach den Optionen des Simulators kann dies mit oder ohne Abschneiden der MPS-Bindungsdimensionen erfolgen. Das Standardverhalten ist keine Trunkierung.\n",
        "\n",
        "      * `\"unitary\"`: Simulation einer idealen Schaltung mit einer dichten unitären Matrix. Dies simuliert die unitäre Matrix des Schaltkreises selbst und nicht die Entwicklung eines anfänglichen Quantenzustands. Diese Methode kann nur Gatter simulieren; sie unterstützt keine Messung, kein Reset und kein Rauschen.\n",
        "\n",
        "      * `\"superop\"`: Eine dichte Superoperator-Matrix-Simulation einer idealen oder verrauschten Schaltung. Dies simuliert die Superoperatormatrix des Schaltkreises selbst und nicht die Entwicklung eines anfänglichen Quantenzustands. Mit dieser Methode können ideale und verrauschte Gatter und Rücksetzungen simuliert werden, aber es sind keine Messungen möglich.\n",
        "\n",
        "      * `\"tensor_network\"`: Eine auf einem Tensornetz basierende Simulation, die sowohl den Zustandsvektor als auch die Dichtematrix unterstützt. Derzeit ist dies nur für GPU verfügbar und wird durch die Verwendung von cuQuantum `cuTensorNet` APIs beschleunigt.\n",
        "    </AccordionItem>\n",
        "  </Accordion>\n",
        "\n",
        "<Admonition type=\"note\" title=\"Hinweise\">\n",
        "  - Sie können alle Optionen von „ IBM Quantum Compute “ im lokalen Testmodus festlegen. Mit den clientseitigen Funktionen und `Sampler` `Estimator` (eingeführt in v0.50.0`qiskit-ibm-runtime` ) werden Optionen zur Fehlerunterdrückung und -abmilderung lokal implementiert, sodass Sie verschiedene Methoden zur Fehlerabmilderung lokal testen können, bevor Sie QPU-Zeit dafür aufwenden. Ein Beispiel finden Sie unter „[Testfehlerbehebung lokal](#test-error-mitigation) “.\n",
        "\n",
        "    Bisher ignorierten lokale Simulatoren alle Optionen `shots` mit Ausnahme der veralteten (serverseitigen) Primitive, da diese Verarbeitung ausschließlich auf dem Server stattfand.\n",
        "\n",
        "  - Es wird empfohlen, dass Sie Qiskit Aer installieren, bevor Sie gefälschte Backends oder Aer-Simulatoren verwenden, indem Sie `pip install qiskit-aer` ausführen. Die gefälschten Backends verwenden Aer-Simulatoren unter dem Deckmantel, falls vorhanden, um deren Leistung auszunutzen.\n",
        "</Admonition>\n",
        "\n",
        "{/* If you currently use the Qiskit SDK, you can use the existing Qiskit Aer primitives for local testing.  See [exact and noisy simulation with Qiskit Aer primitives](/docs/guides/simulate-with-qiskit-aer) for details. */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "366b1216-fb2f-4d06-afd8-fe374ab6ed9a",
      "metadata": {},
      "source": [
        "<span id=\"fake-backends-example\" />\n",
        "\n",
        "## Beispiel für gefälschte Backends\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "efda5007-260a-49c0-ab6f-eac91fdbdf84",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0\n",
        "# from qiskit_ibm_runtime import Sampler\n",
        "\n",
        "# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0\n",
        "from qiskit_ibm_runtime.executor_sampler import Sampler\n",
        "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using FakeManilaV2\n",
        "fake_manila = FakeManilaV2()\n",
        "pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "\n",
        "# You can use a fixed seed to get fixed results.\n",
        "options = {\"simulator\": {\"seed_simulator\": 42}}\n",
        "sampler = Sampler(mode=fake_manila, options=options)\n",
        "\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b51e77c0-31c9-4dfa-950c-0a9ea9247aac",
      "metadata": {},
      "source": [
        "<span id=\"aersimulator-examples\" />\n",
        "\n",
        "## AerSimulator Beispiele\n",
        "\n",
        "Beispiel mit Sitzungen, ohne Lärm:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "63407a34-0c70-400a-bc34-f85ccd581c4d",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import Session\n",
        "\n",
        "# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0\n",
        "# from qiskit_ibm_runtime import Sampler\n",
        "\n",
        "# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0\n",
        "from qiskit_ibm_runtime.executor_sampler import Sampler\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "# Session syntax is supported but ignored because local mode doesn't support sessions.\n",
        "aer_sim = AerSimulator()\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "with Session(backend=aer_sim) as session:\n",
        "    sampler = Sampler(mode=session)\n",
        "    result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a511de6-dc37-4ac4-87f8-bee90e3014a3",
      "metadata": {},
      "source": [
        "Um mit Rauschen zu simulieren, geben Sie eine QPU (Quanten-Hardware) an und übermitteln sie an Aer.  Aer erstellt ein Rauschmodell auf der Grundlage der Kalibrierungsdaten von dieser QPU und instanziiert ein Aer-Backend mit diesem Modell.  Wenn Sie möchten, können Sie auch [ein Geräuschmodell erstellen](/docs/guides/build-noise-models).\n",
        "\n",
        "<Admonition type=\"caution\">\n",
        "  Ein QPU kann durch verschiedene Arten von Lärm beeinträchtigt werden. Das hier verwendete Qiskit-Aer-Rauschmodell simuliert nur einige davon und ist daher wahrscheinlich weniger stark als das Rauschen auf einer echten QPU.\n",
        "\n",
        "  Einzelheiten darüber, welche Fehler bei der Initialisierung eines Rauschmodells von einer QPU enthalten sind, finden Sie in der Aer [`NoiseModel`](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.noise.NoiseModel.html#qiskit_aer.noise.NoiseModel.from_backend) API-Referenz.\n",
        "</Admonition>\n",
        "\n",
        "Beispiel mit Lärm:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "0878eec8-9959-4e98-aff7-bf114352b838",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer import AerSimulator\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0\n",
        "# from qiskit_ibm_runtime import Sampler\n",
        "\n",
        "# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0\n",
        "from qiskit_ibm_runtime.executor_sampler import Sampler\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "\n",
        "# Specify a QPU to use for the noise model\n",
        "real_backend = service.least_busy(operational=True, simulator=False)\n",
        "aer = AerSimulator.from_backend(real_backend)\n",
        "\n",
        "# Run the Sampler job locally using AerSimulator.\n",
        "pm = generate_preset_pass_manager(backend=aer, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2a2815a4-19f9-4ebd-8e53-4e29bea4a8db",
      "metadata": {},
      "source": [
        "<span id=\"clifford-sim\" />\n",
        "\n",
        "<span id=\"clifford-simulation\" />\n",
        "\n",
        "### Clifford-Simulation\n",
        "\n",
        "Da Clifford-Schaltungen effizient und mit überprüfbaren Ergebnissen simuliert werden können, ist die Clifford-Simulation ein sehr nützliches Werkzeug. Ein ausführliches Beispiel finden Sie unter [Effiziente Simulation von Stabilisierungsschaltungen mit Qiskit Aer-Primitiven](/docs/guides/simulate-stabilizer-circuits).\n",
        "\n",
        "Beispiel:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "b9d0fdac-ba2e-4c4e-8c49-c924fb8b5c43",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0\n",
        "# from qiskit_ibm_runtime import Sampler\n",
        "\n",
        "# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0\n",
        "from qiskit_ibm_runtime.executor_sampler import Sampler\n",
        "\n",
        "n_qubits = 500  # <---- note this uses 500 qubits!\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.measure_all()\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "params = rng.choice(\n",
        "    [0, np.pi / 2, np.pi, 3 * np.pi / 2],\n",
        "    size=circuit.num_parameters,\n",
        ")\n",
        "\n",
        "# Tell Aer to use the stabilizer (Clifford) simulation method\n",
        "aer_sim = AerSimulator(method=\"stabilizer\")\n",
        "\n",
        "pm = generate_preset_pass_manager(backend=aer_sim, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "sampler = Sampler(mode=aer_sim)\n",
        "result = sampler.run([isa_qc]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "metadata": {},
      "source": [
        "<span id=\"test-error-mitigation\" />\n",
        "\n",
        "<span id=\"test-error-mitigation-locally\" />\n",
        "\n",
        "## Fehlerbehebung lokal testen\n",
        "\n",
        "Mit den clientseitigen Funktionen und `Sampler` `Estimator` (eingeführt in v0.50.0`qiskit-ibm-runtime` ) erfolgen die Unterdrückung und Abmilderung von Fehlern auf dem Client statt auf dem Server.  Daher werden diese Optionen nun im lokalen Testmodus wirksam, sodass Sie mit verschiedenen Methoden zur Fehlerminderung an einem simulierten Backend experimentieren können, bevor Sie QPU-Zeit investieren.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Bei den älteren serverseitigen Primitiven hatte das Setzen einer Option wie auf `resilience.measure_mitigation` einem lokalen Simulator keine Auswirkungen, da die Abhilfemaßnahmen ausschließlich auf dem Server ausgeführt wurden.  Die clientseitigen Primitive führen diese Verarbeitung lokal durch.\n",
        "</Admonition>\n",
        "\n",
        "<Admonition type=\"caution\" title=\"Überlegungen zu Speicherbedarf und Laufzeit-Overhead\">\n",
        "  Die Kosten für lokale, verrauschte Simulationen steigen exponentiell mit der Anzahl der Qubits, und die meisten Laptops können keine Simulationen mit mehr als etwa 32 Qubits durchführen.  Da die Methoden zur Fehlerunterdrückung und -minderung nun lokal ausgeführt werden, verursachen sie zusätzlich zur Basissimulation einen weiteren Speicher- und Laufzeitaufwand.  Um das lokale Testen überschaubar zu halten, verwenden Sie eine der folgenden Optionen:\n",
        "\n",
        "  * Ein kleines Dummy-Backend (wie z. B `FakeManilaV2`. das unten verwendete).\n",
        "  * Ein geräuschloser Simulator.\n",
        "  * [Clifford-Simulation](#clifford-sim), die auf eine große Anzahl von Qubits skalierbar ist.\n",
        "</Admonition>\n",
        "\n",
        "Im folgenden Beispiel wird die Minderung von Messfehlern aktiviert und `Estimator` auf einem simulierten Backend ausgeführt.  Die Option `measure_mitigation = True` wird nun lokal auf Ihre Schaltkreise angewendet.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "f6e5d4c3-b2a1-4098-9f8e-7d6c5b4a3e2f",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "# Legacy server-side primitive before qiskit-ibm-runtime v0.50.0\n",
        "# from qiskit_ibm_runtime import Estimator\n",
        "\n",
        "# Client-side primitive introduced in qiskit-ibm-runtime v0.50.0\n",
        "from qiskit_ibm_runtime.executor_estimator import Estimator\n",
        "from qiskit_ibm_runtime.fake_provider import FakeManilaV2\n",
        "\n",
        "# Bell Circuit\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "\n",
        "observable = SparsePauliOp(\"ZZ\")\n",
        "\n",
        "# Transpile the circuit and observable for the fake backend\n",
        "fake_manila = FakeManilaV2()\n",
        "pm = generate_preset_pass_manager(backend=fake_manila, optimization_level=1)\n",
        "isa_qc = pm.run(qc)\n",
        "isa_observable = observable.apply_layout(isa_qc.layout)\n",
        "\n",
        "# Run the Estimator job locally using FakeManilaV2\n",
        "estimator = Estimator(mode=fake_manila)\n",
        "\n",
        "# With the client-side Estimator, this option takes effect locally\n",
        "estimator.options.resilience.measure_mitigation = True\n",
        "\n",
        "result = estimator.run([(isa_qc, isa_observable)]).result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee461e4d-ee50-4430-9e83-c3b49cd7a1ef",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Verwenden Sie das Tool, um die Auswirkungen von Rauschen [`Neat` Klasse](/docs/guides/debug-qiskit-runtime-jobs) auf eine Estimator-Workload zu analysieren.\n",
        "  * Sehen Sie sich detaillierte [Beispiele für Sampler](/docs/guides/sampler-examples) an.\n",
        "  * Sehen Sie sich detaillierte [Beispiele für den Kostenvoranschlag](/docs/guides/estimator-examples) an.\n",
        "  * Üben Sie den Umgang mit Primitiven, indem Sie die [Lektion über die Kostenfunktion](/learning/courses/variational-algorithm-design/cost-functions) auf IBM Quantum Learning durcharbeiten.\n",
        "  * Wie Sie lokal transpilieren können, erfahren Sie im Abschnitt [Transpilieren](/docs/guides/transpile).\n",
        "  * Probieren Sie das Tutorial [„Transpiler-Einstellungen vergleichen“](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings) aus.\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
}