{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "008d2ceb-f6fa-42f6-a7df-6bd604775278",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Schnellstart für den Kostenvoranschlagsrechner\"\n",
        "description: \"Eine Kurzanleitung zur Verwendung der „ IBM Quantum “-Estimator-Primitive.\"\n",
        "---\n",
        "\n",
        "<span id=\"estimator-quickstart\" />\n",
        "\n",
        "# Schnellstart für den Kostenvoranschlagsrechner\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49f269ba-e11d-4e5c-bbba-9d4a10540ad8",
      "metadata": {},
      "source": [
        "Die Estimator-Primitive berechnet die Erwartungswerte für eine oder mehrere Observablen in Bezug auf Zustände, die von Quantenschaltungen erzeugt wurden. Die Schaltungen können parametrisiert werden, sofern die Parameterwerte ebenfalls als Eingabe für die Primitive bereitgestellt werden.\n",
        "\n",
        "Diese Primitive verfügt über mehrere integrierte [Techniken zur Fehlerminderung und -unterdrückung](/docs/guides/error-mitigation-and-suppression-techniques), darunter dynamische Entkopplung, Pauli-Twirling, Gate-Folding-ZNE, PEA und PEC. Außerdem unterstützt es eine Option `resilience_level` , mit der Sie den Kompromiss zwischen Kosten und Genauigkeit ganz einfach konfigurieren können.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b7e96291-0925-4d7f-81a8-a7738549477c",
      "metadata": {},
      "source": [
        "In den Schritten dieses Abschnitts wird beschrieben, wie Sie Estimator einrichten, die verfügbaren Konfigurationsoptionen erkunden und das Programm aufrufen.\n",
        "\n",
        "<Admonition type=\"note\" title=\"Implementierung des neuen Schätzers\">\n",
        "  In qiskit-ibm-runtime v0.50.0 wurden neue Implementierungen der Qiskit-Schnittstellen „ SamplerV2 “ und „ EstimatorV2 “ eingeführt. Diese clientseitigen Primitive führen den Großteil der Vor- und Nachbearbeitung auf der Clientseite durch und delegieren die Ausführung an die Executor-Primitive. Die Ausführung auf der Client-Seite bietet mehr Transparenz, schnelleres Feedback bei der Fehlersuche und eine präzisere Steuerung.\n",
        "\n",
        "  Da sie dieselbe API implementieren, lassen sich diese clientseitigen Primitive weitgehend direkt anstelle der bisherigen serverseitigen Primitive einsetzen, wobei die einzige Änderung in der Import-Anweisung besteht. Weitere Informationen finden Sie unter „[Migration vom serverseitigen zum clientseitigen Sampler und Estimator](/docs/guides/migrate-to-client-side-primitives) “.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "818a2b3d-3950-4a28-8e37-39959c56484b",
      "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",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bafa61f0-c049-4ee6-ac76-a0ed97e67caf",
      "metadata": {},
      "source": [
        "{/*Verified the v2 examples 2/29/24 - updated 10/29/24*/}\n",
        "\n",
        "<span id=\"steps-to-use-the-estimator-primitive\" />\n",
        "\n",
        "## Schritte zur Verwendung der Estimator-Primitive\n",
        "\n",
        "<span id=\"1-initialize-the-account\" />\n",
        "\n",
        "### 1. Konto einrichten\n",
        "\n",
        "Zunächst müssen Sie 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](cloud-setup) “, falls Sie noch kein Konto haben.\n",
        "\n",
        "<Admonition type=\"note\" title=\"Teilgatter\">\n",
        "  Um die neu unterstützten [fraktionierten Gates](/docs/guides/fractional-gates) zu nutzen, legen Sie fest `use_fractional_gates=True` , wenn Sie eine Backend-Anfrage an eine `QiskitRuntimeService` -Instanz stellen. Zum Beispiel:\n",
        "\n",
        "  ```python\n",
        "  service = QiskitRuntimeService()\n",
        "  fractional_gate_backend = service.least_busy(use_fractional_gates=True)\n",
        "  ```\n",
        "\n",
        "  Dies ist eine experimentelle Funktion, die sich in Zukunft ändern kann.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "71d62ba2-b1ba-405a-b304-5bdd7ec5e11b",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "ibm_fez\n"
          ]
        }
      ],
      "source": [
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(\n",
        "    operational=True, simulator=False, min_num_qubits=127\n",
        ")\n",
        "\n",
        "print(backend.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d894fbe3-3ea8-4db0-908e-95790b560ddb",
      "metadata": {},
      "source": [
        "<span id=\"2-create-a-circuit-and-an-observable\" />\n",
        "\n",
        "### 2. Erstelle einen Schaltkreis und eine Beobachtungsgröße\n",
        "\n",
        "Als Eingaben für die Estimator-Primitive benötigst du mindestens einen Schaltkreis und eine Beobachtungsgröße.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "c0ad8982-d19b-46d4-8a2d-dd30357c0e52",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit.library import qaoa_ansatz\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]\n",
        "observable = SparsePauliOp.from_sparse_list(\n",
        "    [(\"ZZ\", [i, j], 0.5) for i, j in entanglement],\n",
        "    num_qubits=backend.num_qubits,\n",
        ")\n",
        "circuit = qaoa_ansatz(observable, reps=2)\n",
        "# The circuit is parametrized, so we will define the parameter values for execution\n",
        "param_values = [0.1, 0.2, 0.3, 0.4]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "84b42c6f-d80e-4cff-8e34-03affa566a97",
      "metadata": {},
      "source": [
        "Die Schaltung und die Observable müssen so umgewandelt werden, dass sie ausschließlich Befehle verwenden, die von der QPU unterstützt werden (sogenannte *ISA* -Schaltungen). Verwenden Sie dazu den Transpiler.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "abefc665-24a7-466e-a9ec-67cac6a50ebd",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])\n"
          ]
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "pm = generate_preset_pass_manager(optimization_level=1, backend=backend)\n",
        "isa_circuit = pm.run(circuit)\n",
        "isa_observable = observable.apply_layout(isa_circuit.layout)\n",
        "print(f\">>> Circuit ops (ISA): {isa_circuit.count_ops()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b53e9ab3-7d87-4dd5-b362-138b24cfa73b",
      "metadata": {},
      "source": [
        "<span id=\"3-initialize-the-ibm-quantum-estimator\" />\n",
        "\n",
        "### 3. Initialisieren Sie den „ IBM Quantum “-Schätzer\n",
        "\n",
        "Wenn Sie Estimator initialisieren, legen Sie mithilfe des Parameters `mode` fest, in welchem Modus das Programm ausgeführt werden soll.  Mögliche Werte sind `batch`, `session`, oder Objekte `backend` für den Batch-, Sitzungs- bzw. Job-Ausführungsmodus. Weitere Informationen finden Sie unter „[Einführung in die Ausführungsmodi des Dienstes ‚ IBM Quantum Compute ‘](/docs/guides/execution-modes) “. Bitte beachten Sie, dass Open-Plan-Benutzer keine Sitzungsaufträge einreichen können.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "961508db-e534-4fc9-970d-7babcd6c39ef",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0\n",
        "# from qiskit_ibm_runtime import Estimator\n",
        "\n",
        "# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0\n",
        "from qiskit_ibm_runtime.executor_estimator import Estimator\n",
        "\n",
        "estimator = Estimator(mode=backend)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "59b13a43-0c9f-4fdb-a379-af5115c153e1",
      "metadata": {},
      "source": [
        "<span id=\"4-invoke-estimator-and-get-results\" />\n",
        "\n",
        "### 4. Den Schätzer aufrufen und Ergebnisse abrufen\n",
        "\n",
        "Rufen Sie anschließend die `run()` Methode auf, um die Erwartungswerte für die Eingangsschaltungen und Observablen zu berechnen. Die Schaltkreis-, Beobachtungs- und optionalen Parameterwertsätze werden als Tupel aus *primitiven vereinheitlichten Blöcken* ( PUB ) eingegeben.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "f1a60bad-cf09-4136-aa1a-4482759b3aea",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job ID: dab7lfurrl7c7386gjn0\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> Job Status: QUEUED\n"
          ]
        }
      ],
      "source": [
        "job = estimator.run([(isa_circuit, isa_observable, param_values)])\n",
        "print(f\">>> Job ID: {job.job_id()}\")\n",
        "print(f\">>> Job Status: {job.status()}\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "c817cce5-4686-43d2-89a1-ed0842d8ace3",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            ">>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})\n",
            "  > Expectation value: 28.60306448415693\n",
            "  > Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}\n"
          ]
        }
      ],
      "source": [
        "result = job.result()\n",
        "print(f\">>> {result}\")\n",
        "print(f\"  > Expectation value: {result[0].data.evs}\")\n",
        "print(f\"  > Metadata: {result[0].metadata}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d38dd409-e0d8-4749-bb22-58ae9a53d26a",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Erfahren Sie, wie Sie [lokal testen](local-testing-mode) können, bevor Sie Ihre Programme auf Quantencomputern ausführen.\n",
        "  * Sehen Sie sich detaillierte [Beispiele](/docs/guides/estimator-examples) an.\n",
        "  * Üben Sie den Umgang mit Primitiven, indem Sie die [Lektion zur Cost-Funktion](/learning/courses/variational-algorithm-design/cost-functions) unter IBM Quantum Learning durcharbeiten.\n",
        "  * Im Abschnitt [„Transpile“](/docs/guides/transpile/) erfahren Sie, wie Sie lokal transpilieren können.\n",
        "  * Lesen Sie die Anleitung [zum Vergleichen von Transpiler-Einstellungen](/docs/guides/circuit-transpilation-settings#compare-transpiler-settings).\n",
        "  * Erfahren Sie, wie Sie [die grundlegenden Optionen nutzen](runtime-options-overview).\n",
        "  * Sehen Sie sich die API für die „[Estimator](/docs/api/qiskit-ibm-runtime/options-models-estimator-options) “-Optionen an.\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
}