{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "aea62c4c-1e42-4472-9f1d-e52783e81fc6",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Schaltkreisbibliothek\"\n",
        "description: \"Erfahren Sie mehr über die sofort einsatzbereiten Schaltungen aus der Qiskit-Schaltungsbibliothek, darunter N-lokale Schaltungen, Zeitentwicklungsschaltungen und Datenkodierungsschaltungen\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore cout */}\n",
        "\n",
        "<span id=\"circuit-library\" />\n",
        "\n",
        "# Schaltkreisbibliothek\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "14baab34-71a4-4d3c-bdc1-083bb2c32065",
      "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",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "6f257ff9-15c4-48d8-9503-7f0ab16a91b2",
      "metadata": {},
      "source": [
        "Das Qiskit SDK enthält eine Bibliothek beliebter Schaltungen, die Sie als Bausteine für Ihre eigenen Programme verwenden können. Die Verwendung vordefinierter Schaltungen spart Zeit bei der Recherche, beim Schreiben von Code und bei der Fehlersuche. Die Bibliothek enthält populäre Schaltungen für die Quanteninformatik, Schaltungen, die auf klassischem Wege schwer zu simulieren sind, und Schaltungen, die für das Benchmarking von Quantenhardware nützlich sind.\n",
        "\n",
        "Auf dieser Seite sind die verschiedenen Schaltkreiskategorien aufgeführt, die die Bibliothek anbietet. Eine vollständige Liste der Schaltkreise finden Sie in der [API-Dokumentation der Schaltkreisbibliothek](/docs/api/qiskit/circuit_library).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0b473350",
      "metadata": {},
      "source": [
        "<span id=\"standard-gates\" />\n",
        "\n",
        "## Standardtore\n",
        "\n",
        "Die Schaltkreisbibliothek enthält auch Standard-Quantengatter. Einige sind grundlegendere Gatter (wie das `UGate`), andere sind Multi-Qubit-Gatter, die in der Regel aus Ein- und Zwei-Qubit-Gattern aufgebaut werden müssen. Um Ihrer Schaltung importierte Gatter hinzuzufügen, verwenden Sie die Methode `append` ; das erste Argument ist das Gatter und das nächste Argument ist eine Liste von Qubits, auf die das Gatter angewendet werden soll.\n",
        "\n",
        "Die folgende Codezelle erzeugt beispielsweise eine Schaltung mit einem Hadamard-Gatter und einem mehrfach gesteuerten X-Gatter.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "a846a845-7ac5-4c92-b124-d2b90a773ba2",
      "metadata": {
        "tags": [
          "ignore-warnings"
        ]
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/a846a845-7ac5-4c92-b124-d2b90a773ba2-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.circuit.library import HGate, MCXGate\n",
        "\n",
        "mcx_gate = MCXGate(3)\n",
        "hadamard_gate = HGate()\n",
        "\n",
        "qc = QuantumCircuit(4)\n",
        "qc.append(hadamard_gate, [0])\n",
        "qc.append(mcx_gate, [0, 1, 2, 3])\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e5066595",
      "metadata": {},
      "source": [
        "Siehe [Standardgatter](/docs/api/qiskit/circuit_library#standard-gates) in der API-Dokumentation der Schaltkreisbibliothek.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f1d7c8c9-1b4d-45e1-9cd5-c5d76c2e25ab",
      "metadata": {},
      "source": [
        "<span id=\"n-local-circuits\" />\n",
        "\n",
        "## N-lokale Schaltungen\n",
        "\n",
        "Bei diesen Schaltungen wechseln sich Schichten von Ein-Qubit-Rotationsgattern mit Schichten von Mehr-Qubit-Verschränkungsgattern ab.\n",
        "\n",
        "Diese Familie von Schaltkreisen ist bei variablen Quantenalgorithmen sehr beliebt, da sie eine breite Palette von Quantenzuständen erzeugen können. Variationsalgorithmen passen die Gatterparameter an, um Zustände zu finden, die bestimmte Eigenschaften aufweisen (z. B. Zustände, die eine gute Lösung für ein Optimierungsproblem darstellen). Zu diesem Zweck sind viele Schaltungen in der Bibliothek **parametrisiert**, das heißt, Sie können sie ohne feste Werte definieren.\n",
        "\n",
        "Die folgende Codezelle importiert eine `n_local` -Schaltung, in der die Verschränkungsgatter Zwei-Qubit-Gatter sind. Diese Schaltung verschachtelt Blöcke von parametrisierten Ein-Qubit-Gattern, gefolgt von verschränkten Blöcken von Zwei-Qubit-Gattern. Der folgende Code erzeugt eine Drei-Qubit-Schaltung mit Ein-Qubit-RX-Toren und Zwei-Qubit-CZ-Toren.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "3ccaeb1b-03c6-4dfa-9000-e48db2516303",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/3ccaeb1b-03c6-4dfa-9000-e48db2516303-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import n_local\n",
        "\n",
        "two_local = n_local(3, \"rx\", \"cz\")\n",
        "two_local.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e32e031b-3218-4c1c-af7c-b40ad6c82100",
      "metadata": {},
      "source": [
        "Über das Attribut `parameters` können Sie ein listenähnliches Objekt mit den Parametern des Stromkreises abrufen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "d503e1c8-0ccd-4868-a5dc-4806d00ab54b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "ParameterView([ParameterVectorElement(θ[0]), ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]), ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]), ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]), ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]), ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]), ParameterVectorElement(θ[11])])"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "two_local.parameters"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "555aca2a-a754-4372-8846-22ee4773ece1",
      "metadata": {},
      "source": [
        "Sie können diese Parameter auch mit Hilfe eines Wörterbuchs der Form `{ Parameter: number }` realen Werten zuordnen. Zur Veranschaulichung weist die folgende Codezelle jeden Parameter in der Schaltung `0` zu.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "89227b48-12b2-4b1b-9680-55a7fce88a2b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/89227b48-12b2-4b1b-9680-55a7fce88a2b-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "bound_circuit = two_local.assign_parameters(\n",
        "    {p: 0 for p in two_local.parameters}\n",
        ")\n",
        "bound_circuit.decompose().draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "78772993-d0da-4651-9211-706e86a59432",
      "metadata": {},
      "source": [
        "Weitere Informationen finden Sie unter [N-lokale Gatter](/docs/api/qiskit/circuit_library#n-local-circuits) in der API-Dokumentation der Schaltkreisbibliothek oder im [Kurs Entwurf von Variationsalgorithmen](/learning/courses/variational-algorithm-design) unter IBM Quantum Learning.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3e463081-bce9-4ee2-9046-97659e9ac847",
      "metadata": {},
      "source": [
        "<span id=\"data-encoding-circuits\" />\n",
        "\n",
        "## Datenkodierungsschaltungen\n",
        "\n",
        "Diese parametrisierten Schaltkreise kodieren Daten in Quantenzustände, die von Algorithmen des maschinellen Lernens auf Quantenbasis verarbeitet werden. Einige von Qiskit unterstützte Schaltungen sind:\n",
        "\n",
        "* Amplitudencodierung, bei der jede Zahl in die Amplitude eines Basiszustands codiert wird. Damit können $2^n$ Zahlen in einem einzigen Zustand gespeichert werden, was jedoch kostspielig sein kann.\n",
        "* Basiscodierung, die eine ganze Zahl $k$ durch die Vorbereitung des entsprechenden Basiszustands $|k\\rangle$ codiert.\n",
        "* Winkelcodierung, die jede Zahl in den Daten als Drehwinkel in einer parametrisierten Schaltung festlegt.\n",
        "\n",
        "Welcher Ansatz der beste ist, hängt von den Besonderheiten Ihrer Anwendung ab. Auf aktuellen Quantencomputern werden jedoch häufig winkelcodierende Schaltungen wie die `zz_feature_map` verwendet.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "cf8b1efc-57b3-4681-8e6a-d5b8406d092d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/cf8b1efc-57b3-4681-8e6a-d5b8406d092d-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import zz_feature_map\n",
        "\n",
        "features = [0.2, 0.4, 0.8]\n",
        "feature_map = zz_feature_map(feature_dimension=len(features))\n",
        "\n",
        "encoded = feature_map.assign_parameters(features)\n",
        "encoded.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "031bf004-ca80-4cc0-b153-2cd5cd778386",
      "metadata": {},
      "source": [
        "Siehe [Datenkodierungsschaltungen](/docs/api/qiskit/circuit_library#data-encoding-circuits) in der API-Dokumentation der Schaltkreisbibliothek.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5c5d2735-ef6a-48db-8382-9dc03c9af20a",
      "metadata": {},
      "source": [
        "<span id=\"time-evolution-circuits\" />\n",
        "\n",
        "## Zeitentwicklungs-Schaltungen\n",
        "\n",
        "Diese Schaltungen simulieren einen Quantenzustand, der sich in der Zeit entwickelt. Verwenden Sie Zeitentwicklungsschaltungen, um physikalische Effekte wie Wärmeübertragung oder Phasenübergänge in einem System zu untersuchen. Zeit-Evolutions-Schaltkreise sind auch ein grundlegender Baustein für chemische Wellenfunktionen (wie unitäre gekoppelte Cluster-Versuchszustände) und für den QAOA-Algorithmus, den wir für Optimierungsprobleme verwenden.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "834794df-86e9-4bea-8efa-5380499e359b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/834794df-86e9-4bea-8efa-5380499e359b-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import PauliEvolutionGate\n",
        "from qiskit.circuit import QuantumCircuit\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "\n",
        "# Prepare an initial state with a Hadamard on the middle qubit\n",
        "state = QuantumCircuit(3)\n",
        "state.h(1)\n",
        "\n",
        "hamiltonian = SparsePauliOp([\"ZZI\", \"IZZ\"])\n",
        "evolution = PauliEvolutionGate(hamiltonian, time=1)\n",
        "\n",
        "# Evolve state by appending the evolution gate\n",
        "state.compose(evolution, inplace=True)\n",
        "\n",
        "state.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e2dad12f-535a-4f42-8ac4-dbfcfb5533cc",
      "metadata": {},
      "source": [
        "Lesen Sie die [`PauliEvolutionGate` API-Dokumentation](/docs/api/qiskit/qiskit.circuit.library.PauliEvolutionGate).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0cf7122d-c3fe-41a6-936c-b3770b33f0f1",
      "metadata": {},
      "source": [
        "<span id=\"benchmarking-and-complexity-theory-circuits\" />\n",
        "\n",
        "## Benchmarking und Komplexitätstheorie-Schaltungen\n",
        "\n",
        "Benchmarking-Schaltungen geben uns ein Gefühl dafür, wie gut unsere Hardware tatsächlich funktioniert, und komplexitätstheoretische Schaltungen helfen uns zu verstehen, wie schwierig die Probleme sind, die wir lösen wollen.\n",
        "\n",
        "Der \"Quantenvolumen\"-Benchmark beispielsweise misst, wie genau ein Quantencomputer eine Art zufälliger Quantenschaltung ausführt. Die Leistung des Quantencomputers steigt mit der Größe des Schaltkreises, den er zuverlässig ausführen kann. Dabei werden alle Aspekte des Computers berücksichtigt, einschließlich der Anzahl der Qubits, der Anweisungstreue, der Qubit-Konnektivität und der Software, die die Ergebnisse umsetzt und nachbearbeitet. Lesen Sie mehr über Quantenvolumen in der [Originalarbeit über Quantenvolumen](https://arxiv.org/abs/1811.12926).\n",
        "\n",
        "Der folgende Code zeigt ein Beispiel für einen in Qiskit erstellten Quantenvolumenschaltkreis, der mit vier Qubits arbeitet (die Blöcke von `unitary` sind randomisierte Zwei-Qubit-Gatter).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "9629a507-8191-409e-b895-fd0833c8fcd7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/9629a507-8191-409e-b895-fd0833c8fcd7-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import quantum_volume\n",
        "\n",
        "quantum_volume(4).draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "908e4b4a-5edf-4390-82a0-e755050c2a37",
      "metadata": {},
      "source": [
        "Die Schaltkreisbibliothek enthält auch Schaltkreise, die auf klassischem Wege nur schwer zu simulieren sind, wie z. B. instantane Quantenpolynomschaltungen (iqp). Bei diesen Schaltungen werden bestimmte diagonale Gatter (in der Berechnungsgrundlage) zwischen Blöcken von Hadamard-Gattern eingefügt.\n",
        "\n",
        "Weitere Schaltungen sind `grover_operator` zur Verwendung im Grover-Algorithmus und die Schaltung `fourier_checking` für das Fourier-Prüfungsproblem. Siehe diese Schaltungen unter [Besondere Quantenschaltungen](/docs/api/qiskit/circuit_library#particular-quantum-circuits) in der API-Dokumentation der Schaltkreisbibliothek.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "58b1a7b8-c173-4de8-957a-ca5d58332073",
      "metadata": {},
      "source": [
        "<span id=\"arithmetic-circuits\" />\n",
        "\n",
        "## Arithmetische Schaltungen\n",
        "\n",
        "Bei den arithmetischen Operationen handelt es sich um klassische Funktionen wie die Addition ganzer Zahlen und bitweise Operationen. Diese können bei Algorithmen wie der Amplitudenschätzung für Finanzanwendungen und bei Algorithmen wie dem HHL-Algorithmus, der lineare Gleichungssysteme löst, nützlich sein.\n",
        "\n",
        "Versuchen wir zum Beispiel, zwei Drei-Bit-Zahlen zu addieren, indem wir eine \"Ripple-Carry\"-Schaltung verwenden, die die Addition an Ort und Stelle durchführt (`FullAdderGate`). Dieser Addierer addiert zwei Zahlen (wir nennen sie \"A\" und \"B\") und schreibt das Ergebnis in das Register, in dem B gespeichert war. Im folgenden Beispiel: A=2 und B=3.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "77555a5a-a81c-47b8-a9ae-3015d84adcf5",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/circuit-library/extracted-outputs/77555a5a-a81c-47b8-a9ae-3015d84adcf5-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import FullAdderGate\n",
        "from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister\n",
        "\n",
        "adder = FullAdderGate(3)  # Adder of 3-bit numbers\n",
        "\n",
        "# Create the number A=2\n",
        "reg_a = QuantumRegister(3, \"a\")\n",
        "number_a = QuantumCircuit(reg_a)\n",
        "number_a.initialize(2)  # Number 2; |010>\n",
        "\n",
        "# Create the number B=3\n",
        "reg_b = QuantumRegister(3, \"b\")\n",
        "number_b = QuantumCircuit(reg_b)\n",
        "number_b.initialize(3)  # Number 3; |011>\n",
        "\n",
        "# Create a circuit to hold everything, including a classical register for\n",
        "# the result\n",
        "qregs = [\n",
        "    QuantumRegister(1, \"cin\"),\n",
        "    QuantumRegister(3, \"a\"),\n",
        "    QuantumRegister(3, \"b\"),\n",
        "    QuantumRegister(1, \"cout\"),\n",
        "]\n",
        "reg_result = ClassicalRegister(3)\n",
        "circuit = QuantumCircuit(*qregs, reg_result)\n",
        "\n",
        "# Compose number initializers with the adder. Adder stores the result to\n",
        "# register B, so we'll measure those qubits.\n",
        "circuit = (\n",
        "    circuit.compose(number_a, qubits=reg_a)\n",
        "    .compose(number_b, qubits=reg_b)\n",
        "    .compose(adder)\n",
        ")\n",
        "circuit.measure(reg_b, reg_result)\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e8a8deee-ad46-42cd-844e-51d5541c3f65",
      "metadata": {},
      "source": [
        "Die Simulation der Schaltung zeigt, dass sie für alle `1024` Schüsse `5` ausgibt (d. h. mit der Wahrscheinlichkeit `1.0` gemessen wird).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "ede21ca4-0358-4c83-9af5-63a1c67ae3cb",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Count data:\n",
            " {5: 1024}\n"
          ]
        }
      ],
      "source": [
        "from qiskit.primitives import StatevectorSampler\n",
        "\n",
        "result = StatevectorSampler().run([circuit]).result()\n",
        "\n",
        "print(f\"Count data:\\n {result[0].data.c0.get_int_counts()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cbd99d49-eb5c-4cd5-bac2-528497b8405e",
      "metadata": {},
      "source": [
        "Siehe [Arithmetik](/docs/api/qiskit/circuit_library#arithmetic) in der API-Dokumentation der Schaltkreisbibliothek.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9a900a84-c52f-4a03-b3e9-87c71fa93e88",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Lerne im Abschnitt [„Schaltkreise erstellen“](/docs/guides/construct-circuits) fortgeschrittene Methoden zum Erstellen von Schaltkreisen kennen.\n",
        "  * Ein Beispiel für die Verwendung von Schaltkreisen finden Sie im Tutorial über [den Grover-Algorithmus](/docs/tutorials/grovers-algorithm).\n",
        "  * Lesen Sie die [API-Referenz der Schaltkreisbibliothek](/docs/api/qiskit/circuit_library).\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
}