{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f7d9993f",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Iskay Quantum Optimizer – Eine Qiskit-Funktion von Kipu Quantum\"\n",
        "description: \"Lösen Sie Optimierungsprobleme effizient mit dem Iskay Quantum Optimizer von Kipu Quantum, verfügbar auf der Plattform „ IBM ” Qiskit Functions Catalog\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore Kipu, DCQO, QUBO, HUBO, counterdiabatic, Iskay, bitflips, Cadavid, Chandarana */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "dde95705",
      "metadata": {},
      "source": [
        "<span id=\"iskay-quantum-optimizer---a-qiskit-function-by-kipu-quantum\" />\n",
        "\n",
        "# Iskay Quantum Optimizer – Eine Qiskit-Funktion von Kipu Quantum\n",
        "\n",
        "*Siehe [API-Referenz](/docs/api/functions/kipu-optimization)*\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "61da1dd5",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c60ba821",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\" title=\"Anmerkung\">\n",
        "  * Qiskit-Funktionen sind eine experimentelle Funktion, die nur für Benutzer des IBM Quantum® Premium Plan, Flex Plan und On-Prem (über IBM Quantum Platform API) Plan verfügbar ist. Sie befinden sich im Status einer Vorabversion und können sich noch ändern.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"overview\" />\n",
        "\n",
        "## Übersicht\n",
        "\n",
        "Mit dem Iskay Quantum Optimizer von Kipu Quantum können Sie komplexe Optimierungsprobleme mit IBM® Quantencomputern angehen. Dieser Solver nutzt den innovativen [bf-DCQO-Algorithmus](https://doi.org/10.48550/arXiv.2409.04477) von Kipu, der nur die Zielfunktion als Eingabe benötigt, um automatisch Problemlösungen zu liefern. Es kann Optimierungsprobleme mit bis zu 156 Qubits lösen und ermöglicht die Nutzung aller Qubits der IBM Quantengeräte. Der Optimierer verwendet ein 1-to-1 Mapping zwischen klassischen Variablen und Qubits, das es Ihnen ermöglicht, Optimierungsprobleme mit bis zu 156 binären Variablen zu lösen.\n",
        "\n",
        "Der Optimizer ermöglicht das Lösen von uneingeschränkten binären Optimierungsproblemen. Zusätzlich zu der häufig verwendeten QUBO-Formulierung (Quadratic Unconstrained Binary Optimization) unterstützt es auch Optimierungsprobleme höherer Ordnung (HUBO). Der Löser verwendet einen nicht-variablen Quantenalgorithmus, der den Großteil der Berechnungen auf Quantengeräten durchführt.\n",
        "\n",
        "Im Folgenden finden Sie weitere Einzelheiten über den verwendeten Algorithmus und eine kurze Anleitung zur Verwendung der Funktion sowie Benchmarking-Ergebnisse zu verschiedenen Problemfällen unterschiedlicher Größe und Komplexität.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f761442",
      "metadata": {},
      "source": [
        "<span id=\"description\" />\n",
        "\n",
        "## Beschreibung\n",
        "\n",
        "Der Optimizer ist eine gebrauchsfertige Implementierung modernster Quantenoptimierungsalgorithmen. Es löst Optimierungsprobleme, indem es hochkomprimierte Quantenschaltungen auf Quantenhardware ausführt. Diese Kompression wird durch die Einführung gegendiabatischer Terme in die zugrunde liegende Zeitentwicklung des Quantensystems erreicht. Der Algorithmus führt mehrere Iterationen von Hardware-Durchläufen durch, um die endgültigen Lösungen zu erhalten, und kombiniert diese mit einer Nachbearbeitung. Diese Schritte sind nahtlos in den Arbeitsablauf des Optimierers integriert und werden automatisch ausgeführt.\n",
        "\n",
        "<span id=\"how-does-the-quantum-optimizer-work\" />\n",
        "\n",
        "### Wie funktioniert der Quantum Optimizer?\n",
        "\n",
        "Dieser Abschnitt beschreibt die Grundlagen des implementierten bf-DCQO-Algorithmus. Eine Einführung in den Algorithmus finden Sie auch auf dem [Qiskit-Kanal „ YouTube](https://www.youtube.com/watch?v=33QmsXhIlpU\\&t=1223s) “.\n",
        "\n",
        "Der Algorithmus basiert auf der zeitlichen Entwicklung eines Quantensystems, das über die Zeit transformiert wird, wobei die Problemlösung im Grundzustand des Quantensystems am Ende der Entwicklung kodiert ist. Nach dem [adiabatischen Theorem](https://en.wikipedia.org/wiki/Adiabatic_theorem) muss diese Entwicklung langsam sein, damit das System in seinem Grundzustand bleibt. Die Digitalisierung dieser Entwicklung ist die Grundlage der digitalisierten adiabatischen Quantenberechnung (DQA) und des berüchtigten QAOA-Algorithmus. Die geforderte langsame Evolution ist jedoch bei zunehmender Problemgröße nicht machbar, da sie zu einer zunehmenden Schaltungstiefe führt. Durch die Verwendung von gegendiabatischen Protokollen können Sie unerwünschte Anregungen unterdrücken, die während kurzer Entwicklungszeiten auftreten, während Sie im Grundzustand bleiben. In diesem Fall führt die Digitalisierung dieser kürzeren Entwicklungszeit zu Quantenschaltungen mit geringerer Tiefe und weniger Verschränkungsgattern.\n",
        "\n",
        "Die Schaltungen der bf-DCQO-Algorithmen benötigen typischerweise bis zu zehnmal weniger Verschränkungsgatter als DQA und drei- bis viermal weniger Verschränkungsgatter als Standard-QAOA-Implementierungen. Aufgrund der geringeren Anzahl von Gattern treten bei der Ausführung der Schaltung in der Hardware weniger Fehler auf. Daher muss der Optimierer keine Techniken wie Fehlerunterdrückung oder -minderung anwenden. Durch ihre Implementierung in künftigen Versionen kann die Qualität der Lösung noch weiter verbessert werden.\n",
        "\n",
        "Obwohl der bf-DCQO-Algorithmus Iterationen verwendet, ist er nicht-variabel. Nach jeder Iteration des Algorithmus wird die Verteilung der Zustände gemessen. Die erhaltene Verteilung wird zur Berechnung eines so genannten Bias-Feldes verwendet. Das Bias-Feld ermöglicht es, die nächste Iteration von einem Energiezustand in der Nähe der zuvor gefundenen Lösung zu beginnen. Auf diese Weise bewegt sich der Algorithmus mit jeder Iteration zu Lösungen mit geringerer Energie. In der Regel reichen etwa zehn Iterationen aus, um zu einer Lösung zu konvergieren, was insgesamt eine viel geringere Anzahl von Iterationen erfordert als bei Variationsalgorithmen, die in der Größenordnung von etwa 100 Iterationen liegen.\n",
        "\n",
        "Der Optimierer kombiniert den bf-DCQO-Algorithmus mit klassischem Post-Processing. Nach der Messung der Verteilung der Zustände wird eine lokale Suche durchgeführt. Während der lokalen Suche werden die Bits der gemessenen Lösung zufällig umgedreht. Nach der Umkehrung wird die Energie der neuen Bitfolge bewertet. Wenn die Energie niedriger ist, wird die Bitfolge als neue Lösung beibehalten. Die lokale Suche skaliert nur linear mit der Anzahl der Qubits und ist daher rechnerisch günstig. Da die Nachbearbeitung lokale Bitflips korrigiert, gleicht sie Bitflip-Fehler aus, die oft das Ergebnis von Hardwaremängeln und Auslesefehlern sind.\n",
        "\n",
        "<span id=\"workflow\" />\n",
        "\n",
        "### Arbeitsablauf\n",
        "\n",
        "Es folgt eine schematische Darstellung des Arbeitsablaufs des Quantum Optimizer.\n",
        "\n",
        "![Arbeitsablauf](https://quantum.cloud.ibm.com/docs/images/guides/kipu-optimization/workflow.svg \"Arbeitsablauf des Quantum Optimizer\")\n",
        "\n",
        "Mit dem Quantum Optimizer kann die Lösung eines Optimierungsproblems auf Quanten-Hardware reduziert werden auf\n",
        "\n",
        "* Formulieren Sie die Zielfunktion des Problems\n",
        "* Zugriff auf den Optimierer über Qiskit-Funktionen\n",
        "* Führen Sie den Optimierer aus und sammeln Sie das Ergebnis\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34fe075",
      "metadata": {},
      "source": [
        "<span id=\"benchmarks\" />\n",
        "\n",
        "## Benchmarks\n",
        "\n",
        "<Admonition type=\"caution\" title=\"Haftungsausschluss\">\n",
        "  Die Leistung kann sowohl von der jeweiligen Problemstellung als auch von den nachfolgenden Verarbeitungsschritten abhängen. In manchen Fällen können klassische Stichproben und quantengenerierte Stichproben nach einer gleichwertigen Nachbearbeitung eine ähnliche Qualität der Endlösung erzielen. Bei der Bewertung sollte daher der gesamte Optimierungsablauf berücksichtigt werden.\n",
        "</Admonition>\n",
        "\n",
        "Die nachstehenden Benchmark-Metriken zeigen, dass der Optimierer Probleme mit bis zu 156 Qubits effektiv löst und bieten einen allgemeinen Überblick über die Genauigkeit und Skalierbarkeit des Optimierers bei verschiedenen Problemtypen. Beachten Sie, dass die tatsächlichen Leistungskennzahlen je nach den spezifischen Problemmerkmalen variieren können, wie z. B. die Anzahl der Variablen, die Dichte und Lokalität der Terme in der Zielfunktion und die polynomiale Ordnung.\n",
        "\n",
        "Die folgende Tabelle enthält die Annäherungsrate (AR), eine wie folgt definierte Kennzahl:\n",
        "\n",
        "$$\n",
        "AR = \\frac{C^{*} - C_\\textrm{max}}{C_{\\textrm{min}} - C_{\\textrm{max}}},\n",
        "$$\n",
        "\n",
        "$C$ ist die Zielfunktion, $C_{\\textrm{min}}$ und $C_{\\textrm{max}}$ sind ihr Minimal- bzw. Maximalwert und $C^{*}$ sind die Kosten der besten gefundenen Lösung. Daher bedeutet AR=100%, dass der Grundzustand des Problems erreicht wurde.\n",
        "\n",
        "| Beispiel           | Anzahl der Qubits | Annäherungsrate | Gesamtzeit (S) | Laufzeitverbrauch (s) | Gesamtzahl der Schüsse | Anzahl der Iterationen |\n",
        "| ------------------ | :---------------: | :-------------: | :------------: | :-------------------: | :--------------------: | :--------------------: |\n",
        "| Ungewichtet MaxCut |         28        |      100 %      |       180      |       30 Stunden      |           30k          |            5           |\n",
        "| Ungewichtet MaxCut |     30 Stunden    |      100 %      |       180      |       30 Stunden      |           30k          |            5           |\n",
        "| Ungewichtet MaxCut |         32        |      100 %      |       180      |       30 Stunden      |           30k          |            5           |\n",
        "| Ungewichtet MaxCut |         80        |      100 %      |       480      |         60.000        |           90k          |            9           |\n",
        "| Ungewichtet MaxCut |        100        |      100 %      |       330      |         60.000        |           60k          |            6           |\n",
        "| Ungewichtet MaxCut |        120        |      100 %      |       370      |         60.000        |           60k          |            6           |\n",
        "| HUBO 1             |        156        |      100 %      |       600      |           70          |          100k          |           10           |\n",
        "| HUBO 2             |        156        |      100 %      |       600      |           70          |          100k          |           10           |\n",
        "\n",
        "* Die MaxCut Instanzen mit 28, 30 und 32 Qubits wurden auf ibm\\_sherbrooke ausgeführt. Die Instanzen mit 80, 100 und 120 wurden auf einem Heron r2 Prozessor ausgeführt.\n",
        "* Die HUBO-Instanzen wurden ebenfalls auf einem Heron r2 Prozessor ausgeführt.\n",
        "\n",
        "Alle Benchmark-Instanzen sind unter GitHub zugänglich (siehe [Kipu-Benchmark-Instanzen](https://github.com/Kipu-Quantum-GmbH/benchmark-instances) ). Ein Beispiel für die Ausführung dieser Instanzen finden Sie in [Beispiel 3: Benchmark-Instanzen](#example-3-benchmark-instances).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "73390a19",
      "metadata": {},
      "source": [
        "<span id=\"get-started\" />\n",
        "\n",
        "## Erste Schritte\n",
        "\n",
        "In dieser Dokumentation werden wir die Schritte zur Verwendung des Iskay Quantum Optimizers durchgehen. Dabei zeigen wir Ihnen schnell, wie Sie die Funktion aus dem Katalog laden und Ihr Problem in eine gültige Eingabe umwandeln können, während wir Ihnen gleichzeitig zeigen, wie Sie mit verschiedenen optionalen Parametern experimentieren können.\n",
        "\n",
        "Ein ausführlicheres Beispiel finden Sie im Tutorial „[Lösen Sie das Problem der Marktaufteilung mit dem Iskay Quantum Optimizer von Kipu Quantum](/docs/tutorials/solve-market-split-problem-with-iskay-quantum-optimizer) “, in dem wir den gesamten Prozess der Verwendung des Iskay Solvers zur Lösung des Problems der Marktaufteilung durchgehen. Dabei handelt es sich um eine reale Herausforderung der Ressourcenallokation, bei der Märkte in ausgewogene Vertriebsregionen aufgeteilt werden müssen, um genaue Nachfragziele zu erreichen.\n",
        "\n",
        "Authentifizieren Sie sich mit Ihrem API-Schlüssel, den Sie auf dem [IBM Quantum Platform Dashboard](http://quantum.cloud.ibm.com/) finden, und wählen Sie die Qiskit-Funktion wie folgt aus:\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e5cd4ac8",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  Der folgende Code setzt voraus, dass Sie Ihre Anmeldedaten gespeichert haben. Falls Sie dies noch nicht getan haben, befolgen Sie die Anweisungen unter [„ IBM Cloud -Konto speichern“,](/docs/guides/functions-get-started#install-qiskit-functions-catalog-client) um sich mit Ihrem API-Schlüssel zu authentifizieren.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "68d3ecea-f7e3-4b4b-b299-1670abc72415",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[QiskitFunction(qunova/hivqe-chemistry),\n",
              " QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),\n",
              " QiskitFunction(algorithmiq/tem),\n",
              " QiskitFunction(qedma/qesem),\n",
              " QiskitFunction(multiverse/singularity),\n",
              " QiskitFunction(ibm/circuit-function),\n",
              " QiskitFunction(q-ctrl/optimization-solver),\n",
              " QiskitFunction(colibritd/quick-pde),\n",
              " QiskitFunction(q-ctrl/performance-management),\n",
              " QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
        "\n",
        "catalog = QiskitFunctionsCatalog(\n",
        "    channel=\"ibm_quantum_platform\",\n",
        "    instance=\"INSTANCE_CRN\",\n",
        "    # For `token`, use the 44-character API_KEY you created\n",
        "    # and saved from the IBM Quantum Platform Home dashboard\n",
        "    token=\"YOUR_API_KEY\",\n",
        ")\n",
        "\n",
        "# verify that you have access to the function\n",
        "catalog.list()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "95a715d2",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Access Function\n",
        "optimizer = catalog.load(\"kipu-quantum/iskay-quantum-optimizer\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4a8e24f7",
      "metadata": {},
      "source": [
        "<span id=\"custom-configuration-example\" />\n",
        "\n",
        "## Beispiel für eine benutzerdefinierte Konfiguration\n",
        "\n",
        "So kannst du Iskay mit verschiedenen Einstellungen konfigurieren:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "712dbae3",
      "metadata": {},
      "outputs": [],
      "source": [
        "custom_options = {\n",
        "    \"shots\": 15_000,  # Higher shot count for better statistics\n",
        "    \"num_iterations\": 12,  # More iterations for solution refinement\n",
        "    \"preprocessing_level\": 1,  # Light preprocessing for problem simplification\n",
        "    \"postprocessing_level\": 2,  # Maximum postprocessing for solution quality\n",
        "    \"transpilation_level\": 3,  # Use higher transpilation level to optimize circuit\n",
        "    \"seed_transpiler\": 42,  # Fixed seed for reproducible results\n",
        "    \"job_tags\": [\"custom_config\"],  # Custom tracking tags\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "50690350",
      "metadata": {},
      "source": [
        "**Seed-Optimierung** : Beachten Sie, dass standardmäßig `seed_transpiler``None` auf gesetzt ist. Dadurch wird der automatische Optimierungsprozess des Transpilers aktiviert. Wenn `None`, startet das System einen Versuch mit mehreren Startwerten und wählt denjenigen aus, der die beste Schaltungstiefe erzeugt, wobei die volle Leistungsfähigkeit des `max_trials` Parameters für jede Transpilierungsstufe genutzt wird.\n",
        "\n",
        "**Leistung auf Transpilierungsstufe** : Eine Erhöhung der Anzahl von `max_trials` mit höheren Werten für `transpilation_level` führt zwangsläufig zu einer Verlängerung der Transpilierungszeit, verändert jedoch nicht immer die endgültige Schaltung – dies hängt stark von der spezifischen Schaltungsstruktur und Komplexität ab. Bei einigen Schaltkreisen/Problemen kann der Unterschied zwischen 10 Versuchen (Stufe 1) und 50 Versuchen (Stufe 5) jedoch dramatisch sein, sodass die Untersuchung dieser Parameter der Schlüssel zum erfolgreichen Finden einer Lösung sein könnte.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d4ca2590",
      "metadata": {},
      "source": [
        "<span id=\"example-1-simple-cost-function\" />\n",
        "\n",
        "## Beispiel 1: Einfache Kostenfunktion\n",
        "\n",
        "Betrachten Sie die Kostenfunktion in der Spin-Formulierung:\n",
        "\n",
        "$$\n",
        "C(x_0, x_1, x_2, x_3, x_4) = 1 + 1.5x_0 + 2x_1 + 1.3x_2 + 2.5x_0x_3 + 3.5x_1x_4 + 4x_0x_1x_2\n",
        "$$\n",
        "\n",
        "wobei $(x_0, ..., x_4) \\in \\{-1, 1\\}^5$.\n",
        "\n",
        "Die Lösung für diese einfache Kostenfunktion lautet\n",
        "\n",
        "$$\n",
        "(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1)\n",
        "$$\n",
        "\n",
        "mit Mindestwert $C^{*} = -6$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a98e8232",
      "metadata": {},
      "source": [
        "<span id=\"1-create-the-objective-function\" />\n",
        "\n",
        "### 1. Erstellen Sie die Zielfunktion\n",
        "\n",
        "Wir beginnen mit der Erstellung eines Wörterbuchs mit den Koeffizienten der Zielfunktion wie folgt:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "3b4a58b1",
      "metadata": {},
      "outputs": [],
      "source": [
        "objective_func = {\n",
        "    \"()\": 1,\n",
        "    \"(0,)\": 1.5,\n",
        "    \"(1,)\": 2,\n",
        "    \"(2,)\": 1.3,\n",
        "    \"(0, 3)\": 2.5,\n",
        "    \"(1, 4)\": 3.5,\n",
        "    \"(0, 1, 2)\": 4,\n",
        "}"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ab63b08f",
      "metadata": {},
      "source": [
        "<span id=\"2-run-the-optimizer\" />\n",
        "\n",
        "### 2. Führen Sie den Optimierer aus\n",
        "\n",
        "Wir lösen das Problem, indem wir den Optimierer laufen lassen. Da $(x_0, ..., x_4) \\in \\{-1, 1\\}^5$ müssen wir `problem_type=spin` einstellen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "469ae361",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Setup options to run the optimizer\n",
        "options = {\"shots\": 5000, \"num_iterations\": 5, \"use_session\": True}\n",
        "\n",
        "arguments = {\n",
        "    \"problem\": objective_func,\n",
        "    \"problem_type\": \"spin\",\n",
        "    \"backend_name\": backend_name,  # such as \"ibm_fez\"\n",
        "    \"options\": options,\n",
        "}\n",
        "\n",
        "job = optimizer.run(**arguments)\n",
        "\n",
        "# Print the ID so you can use it later, if necessary\n",
        "print(job.job_id)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1e3a8542",
      "metadata": {},
      "source": [
        "<span id=\"3-retrieve-the-result\" />\n",
        "\n",
        "### 3. Das Ergebnis abrufen\n",
        "\n",
        "Die Lösung des Optimierungsproblems wird direkt vom Optimierer bereitgestellt.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2f74d7e2",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.result())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c4d0a0f8",
      "metadata": {},
      "source": [
        "Es wird ein Wörterbuch der Form angezeigt:\n",
        "\n",
        "```\n",
        "{'solution': {'0': -1, '1': -1, '2': -1, '3': 1, '4': 1},\n",
        " 'solution_info': {'bitstring': '11100',\n",
        "  'cost': -13.8,\n",
        "  'seed_transpiler': 42,\n",
        "  'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}},\n",
        " 'prob_type': 'spin'}\n",
        "```\n",
        "\n",
        "Beachten Sie, dass das Wörterbuch `solution` den Ergebnisvektor $(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1)$ anzeigt.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7eaa5cac",
      "metadata": {},
      "source": [
        "<span id=\"example-2-maxcut\" />\n",
        "\n",
        "## Beispiel 2: MaxCut\n",
        "\n",
        "Viele Graphenprobleme wie MaxCut oder Maximale unabhängige Menge sind NP-schwere Probleme und ideale Kandidaten für das Testen von Quantenalgorithmen und Hardware. Dieses Beispiel demonstriert die Lösung des MaxCut Problems eines 3-regulären Graphen mit dem Quantum Optimizer.\n",
        "\n",
        "Um dieses Beispiel auszuführen, müssen Sie zusätzlich zu `qiskit-ibm-catalog` das Paket `networkx` installieren. Führen Sie folgenden Befehl aus, um sie zu installieren:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "9ea6d138",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install networkx numpy"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0c63487f",
      "metadata": {},
      "source": [
        "<span id=\"1-create-the-objective-function\" />\n",
        "\n",
        "### 1. Erstellen Sie die Zielfunktion\n",
        "\n",
        "Beginnen Sie mit der Erzeugung eines zufälligen 3-regulären Graphen. Für dieses Diagramm definieren wir die Zielfunktion des MaxCut Problems.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "d1d4017f",
      "metadata": {},
      "outputs": [],
      "source": [
        "import networkx as nx\n",
        "\n",
        "# Create a random 3-regular graph\n",
        "G = nx.random_regular_graph(3, 10, seed=42)\n",
        "\n",
        "\n",
        "# Create the objective function for MaxCut in Ising formulation\n",
        "def graph_to_ising_maxcut(G):\n",
        "    \"\"\"\n",
        "    Convert a NetworkX graph to an Ising Hamiltonian for the max-cut problem.\n",
        "    Args:\n",
        "        G (networkx.Graph): The input graph.\n",
        "    Returns:\n",
        "        dict: The objective function of the Ising model\n",
        "    \"\"\"\n",
        "    # Initialize the linear and quadratic coefficients\n",
        "    objective_func = {}\n",
        "    # Populate the coefficients\n",
        "    for i, j in G.edges:\n",
        "        objective_func[f\"({i}, {j})\"] = 0.5\n",
        "    return objective_func\n",
        "\n",
        "\n",
        "objective_func = graph_to_ising_maxcut(G)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3be09664",
      "metadata": {},
      "source": [
        "<span id=\"2-run-the-optimizer\" />\n",
        "\n",
        "### 2. Führen Sie den Optimierer aus\n",
        "\n",
        "Lösen Sie das Problem, indem Sie den Optimierer ausführen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "2499ab67",
      "metadata": {},
      "outputs": [],
      "source": [
        "options = {\"shots\": 5000, \"num_iterations\": 5, \"use_session\": True}\n",
        "\n",
        "arguments = {\n",
        "    \"problem\": objective_func,\n",
        "    \"problem_type\": \"spin\",\n",
        "    \"backend_name\": backend_name,  # such as \"ibm_fez\"\n",
        "    \"options\": options,\n",
        "}\n",
        "\n",
        "job = optimizer.run(**arguments)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3548f6dc",
      "metadata": {},
      "source": [
        "<span id=\"3-retrieve-the-result\" />\n",
        "\n",
        "### 3. Das Ergebnis abrufen\n",
        "\n",
        "Abrufen des Ergebnisses und Zurückführen der Lösungs-Bitstrings auf die ursprünglichen Graphknoten.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "169cbd6e",
      "metadata": {},
      "outputs": [],
      "source": [
        "print(job.result())"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7f22d66a",
      "metadata": {},
      "source": [
        "Die Lösung des Maxcut-Problems ist direkt im Unterverzeichnis `solution` des Ergebnisobjekts enthalten\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "38309554",
      "metadata": {},
      "outputs": [],
      "source": [
        "maxcut_solution = job.result()[\"solution\"]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "19a664c4",
      "metadata": {},
      "source": [
        "<span id=\"example-3-benchmark-instances\" />\n",
        "\n",
        "## Beispiel 3: Benchmark-Instanzen\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "98545ce3",
      "metadata": {},
      "source": [
        "Die Benchmark-Instanzen sind unter [„](https://github.com/Kipu-Quantum-GmbH/benchmark-instances)GitHub: -Kipu-Benchmark-Instanzen” verfügbar.\n",
        "\n",
        "Die Instanzen können mit der Bibliothek `pygithub` geladen werden. Führen Sie folgenden Befehl aus, um sie zu installieren:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "1d8777e4",
      "metadata": {},
      "outputs": [],
      "source": [
        "# %pip install pygithub"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e3a03447",
      "metadata": {},
      "source": [
        "Die Pfade für die Benchmark-Instanzen sind:\n",
        "\n",
        "**Maxcut:**\n",
        "\n",
        "* `'maxcut/maxcut_regular_3_100_nodes_weighted.json'`\n",
        "* `'maxcut/maxcut_regular_3_140_nodes_weighted.json'`\n",
        "* `'maxcut/maxcut_regular_3_150_nodes_weighted.json'`\n",
        "* `'maxcut/maxcut_regular_4_130_nodes_weighted.json'`\n",
        "\n",
        "**HUBO:**\n",
        "\n",
        "* `'HUBO/hubo1_marrakesh.json'`\n",
        "* `'HUBO/hubo2_marrakesh.json'`\n",
        "\n",
        "Um die Leistung des Benchmarks für die HUBO-Instanzen zu reproduzieren, wählen Sie das Backend `ibm_marrakesh` und setzen Sie `direct_qubit_mapping` auf `True` im Unterverzeichnis `options` .\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "adbed9be",
      "metadata": {},
      "source": [
        "Im folgenden Beispiel wird die Maxcut-Instanz mit 150 Knoten ausgeführt.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "da681a18",
      "metadata": {},
      "outputs": [],
      "source": [
        "from github import Github\n",
        "import urllib\n",
        "import json\n",
        "import ast\n",
        "\n",
        "repo = \"Kipu-Quantum-GmbH/benchmark-instances\"\n",
        "path = \"maxcut/maxcut_regular_3_150_nodes_weighted.json\"\n",
        "gh = Github()\n",
        "repo = gh.get_repo(repo)\n",
        "branch = \"main\"\n",
        "file = repo.get_contents(urllib.parse.quote(path), ref=branch)\n",
        "\n",
        "# load json file with benchmark problem\n",
        "problem_json = json.loads(file.decoded_content)\n",
        "\n",
        "# convert objective function to compatible format\n",
        "objective_func = {\n",
        "    key: ast.literal_eval(value) for key, value in problem_json.items()\n",
        "}\n",
        "\n",
        "\n",
        "# Setup configuration to run the optimizer\n",
        "options = {\n",
        "    \"shots\": 5_000,\n",
        "    \"num_iterations\": 5,\n",
        "    \"use_session\": True,\n",
        "    \"direct_qubit_mapping\": False,\n",
        "}\n",
        "\n",
        "arguments = {\n",
        "    \"problem\": objective_func,\n",
        "    \"problem_type\": \"spin\",\n",
        "    \"backend_name\": \"<BACKEND-NAME>\",\n",
        "    \"options\": options,\n",
        "}\n",
        "\n",
        "job = optimizer.run(**arguments)\n",
        "\n",
        "result = job.result()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "664476ff",
      "metadata": {},
      "source": [
        "<span id=\"use-cases\" />\n",
        "\n",
        "## Anwendungsfälle\n",
        "\n",
        "Typische Anwendungsfälle für den Optimierungslöser sind kombinatorische Optimierungsprobleme. Sie können Probleme aus vielen Branchen lösen, z. B. aus dem Finanzwesen, der Pharmazie oder der Logistik. Beispiele:\n",
        "\n",
        "* Portfolio-Optimierung (QUBO): [wissenschaftliche Veröffentlichung](https://doi.org/10.1103/PhysRevApplied.22.054037) und [Whitepaper](https://kipu-quantum.com/zope64/kipu_2024/content/e3915/e3916/e4187/White-Paper-2-Financial-modeling-on-quantum-computers-using-digitally-compressed-algorithms-1.pdf)\n",
        "* Proteinfaltung (HUBO): [wissenschaftliche Veröffentlichung](https://doi.org/10.1103/PhysRevApplied.20.014024)\n",
        "* Logistikplanung (QUBO): [wissenschaftliche Veröffentlichung](https://doi.org/10.1103/PhysRevApplied.22.064068)\n",
        "* Netzoptimierung: [Webinar](https://www.youtube.com/watch?v=w5SrCIK88No)\n",
        "* Marktaufteilung (QUBO): [Tutorial](/docs/tutorials/solve-market-split-problem-with-iskay-quantum-optimizer)\n",
        "\n",
        "Wenn Sie daran interessiert sind, einen bestimmten Anwendungsfall anzugehen und eine spezielle Zuordnung zu entwickeln, können wir Ihnen dabei helfen. [Kontaktieren Sie uns](https://share-eu1.hsforms.com/2Ff8cgWvTR9ukT_fPoaNhDw2dqpz5).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e9ec2e67",
      "metadata": {},
      "source": [
        "<span id=\"get-support\" />\n",
        "\n",
        "## Unterstützung anfordern\n",
        "\n",
        "Für Unterstützung wenden Sie sich bitte an [support@kipu-quantum.com](mailto:support@kipu-quantum.com).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a6a25c8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "* [Beantragen Sie Zugang zum Quantum Optimizer von Kipu Quantum](https://share-eu1.hsforms.com/2Ff8cgWvTR9ukT_fPoaNhDw2dqpz5).\n",
        "* Rufen Sie die [API-Referenz](/docs/api/functions/kipu-optimization) für diese Qiskit-Funktion auf.\n",
        "* Probieren Sie das Tutorial [„Iskay Quantum Optimizer” von Kipu Quantum aus, um das Problem der Marktsplittung zu lösen](/docs/tutorials/solve-market-split-problem-with-iskay-quantum-optimizer).\n",
        "* Rezension [Romero, S. V., et al. (2025).  Bias-Field-digitalisierter kontradabatischer Quantenalgorithmus für die binäre Optimierung höherer Ordnung. arXiv Vorabdruck arXiv:2409.04477](https://arxiv.org/abs/2409.04477).\n",
        "* Rezension [Cadavid, A. G., et al. (2024).  Bias-Feld-digitalisierte kontradabatische Quantenoptimierung. arXiv Vorabdruck arXiv:2405.13898](https://arxiv.org/abs/2405.13898).\n",
        "* Rezension [Chandarana, P., et al. (2025).  Laufzeit-Quantenvorteil mit digitaler Quantenoptimierung. arXiv Vorabdruck arXiv:2505.08663](https://arxiv.org/abs/2505.08663).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f73ef6c4",
      "metadata": {},
      "source": [
        "<span id=\"additional-information\" />\n",
        "\n",
        "## Weitere  Informationen\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "52b5221c",
      "metadata": {},
      "source": [
        "Iskay ist, wie unser Firmenname Kipu Quantum, ein peruanisches Wort. Obwohl wir ein Startup aus Deutschland sind, stammen diese Worte aus dem Heimatland eines unserer Mitbegründer, wo das Quipu eine der allerersten Rechenmaschinen war, die 2000 Jahre vor Christus von der Menschheit entwickelt wurde.\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
}