Es ist schwer, das Konzept einer Aufgabe zu überdenken, aber das Ergebnis ist es wert.
Anmerkung des Autors : Ich weiß, dass ich den Bragg-Transfer sowohl im klassischen als auch im Quantenfall falsch berechnet habe; Es ist jedoch nah genug an der Wahrheit, um den Unterschied zwischen der Programmierung klassischer und Quantencomputer zu verstehen.
Zeit: irgendwo im Jahr 2018. Ort: fauler Kanal in Slaka.
"Kennst du Python?"
Die Fragen von John Timmer, dem wissenschaftlichen Direktor von Ars Technica, können manchmal überrascht werden. Wenn es möglich wäre, Briefe in Slaka mit Vorsicht zu imprägnieren, würde meine Antwort „Ja“ einfach damit versickern.
Es stellt sich heraus, dass D-Wave beschlossen hat, der Welt über die API Zugriff auf seinen Quantenoptimierer zu gewähren. Ars lud ihn ein, es zu versuchen, aber Sie mussten Python kennen. Ich war bereit dafür.
Ich ging davon aus, dass D-Wave eine fantastische API veröffentlichen würde, die meinen proprietären Code, der Programmierer zum Weinen bringt, in quantenoptimierte Zeilen verwandeln könnte. Als ich zum Quantenoptimierer kam, stellte sich leider heraus, dass dies nicht der Fall war. Ich befand mich schnell in der Dokumentation und versuchte herauszufinden, was ich überhaupt tun musste.
Ich denke, dass der Vertreter der D-Wave-Öffentlichkeitsarbeit eine Person im Sinn hatte, die genug wusste, um vorgefertigte Beispiele zu liefern. Aber ich bin stur. Ich musste mir drei oder vier mögliche Aufgaben einfallen lassen, die ich testen wollte. Ich wollte herausfinden: Kann ich den Prozess der Lösung dieser Probleme auf einem D-Wave-Computer beherrschen? Wie einfach ist es, einen konzeptionellen Sprung von der klassischen Programmierung zur Arbeit mit Quantenglühen zu machen? Passen zumindest einige meiner Aufgaben zu dieser Maschine?
Ich werde sofort eine erstaunliche Schlussfolgerung ziehen und sagen, dass die Antworten wie folgt lauteten: Vielleicht ist es nicht ganz "Mastering"; schwierig; nicht alle Aufgaben.
Auswahl der Aufgaben für die Programmierung
Trotz Ihrer Vorstellung kann ich als praktizierender Programmierer bezeichnet werden. Im Wesentlichen würde jeder mit einem guten Verständnis der Programmierung eine Grimasse ziehen (und möglicherweise einen Mord begehen), nachdem er meinen Python-Code gesehen hat.
Ich kann mir jedoch Aufgaben einfallen lassen, für deren Lösung ein Programm geschrieben werden muss. Ich brauche zum Beispiel etwas, das das elektrische Feld eines Elektrodensatzes berechnet. Etwas, das einen Zustand mit einer minimalen Heliumatomenergie findet. Oder etwas, das die Zunahme der Lichtintensität zu Beginn des Lasers zählt. Diese Aufgaben interessieren mich am meisten. Als ich dieses Projekt startete, hatte ich keine Ahnung, ob die D-Wave-Architektur diese Probleme lösen könnte.
Ich habe zwei Probleme ausgewählt, die meiner Meinung nach funktionieren könnten: Finden von Mitgliedern des Mandelbrot-Sets und Berechnen möglicher Konturen eines Elektrodensatzes. Der Vorteil dieser Probleme war, dass ich sie mit dem klassischen Code schnell lösen und die Antworten vergleichen konnte. Aber ich stieß schnell auf Probleme, um herauszufinden, wie ich diese Probleme auf einer Maschine von D-Wave lösen kann. Es erfordert eine große Veränderung beim Verständnis von Aufgaben, und mein Denken funktioniert ganz einfach.
Eines der Probleme, auf die ich gestoßen bin, ist zum Beispiel, dass es sich um Binärzahlen auf niedriger Ebene handelt (obwohl sie in Form von Qubits und nicht in Form von Bits ausgedrückt werden). Dies bedeutet, dass das Programm tatsächlich keine Typen hat. Fast meine gesamte Programmiererfahrung bestand darin, physikalische Probleme mit numerischen Gleitkommatypen zu lösen.
Sie müssen anders über die Aufgabe denken: Die Antwort sollte als Binärzahl (idealerweise wahr oder falsch) ausgedrückt werden, und die gesamte Physik (zum Beispiel alle Gleitkommazahlen) sollte durch eine Kombination von Qubits ausgedrückt werden. Selbst wenn mein Leben davon abhängen würde, wäre ich nicht in der Lage herauszufinden, wie dies für eine meiner Aufgaben getan werden kann. Eingebettet in den Unterricht ließ ich dieses Problem in meinem eigenen Saft ein wenig kochen.
Sechs Monate später stieß ich schließlich auf ein mir bekanntes Problem, das ich mit einem D-Wave-Computer lösen konnte. Der Lichtdurchgang durch ein Faser-Bragg-Gitter kann als binäres Problem ausgedrückt werden: Ist ein Photon aus dem Filter herausgekommen oder nicht? Die gesamte Physik ist in Qubit-Verbindungen enthalten, und die Antwort wird aus der Energie der Lösung extrahiert.
Bragg Gitter
Ein eindimensionales Bragg-Gitter ist ein mehrschichtiges Material. Jede Lücke zwischen den beiden Schichten reflektiert eine kleine Lichtmenge. Die Gesamtdurchdringung der gesamten Struktur wird durch den Abstand zwischen den Lücken bestimmt. Damit das Licht hindurchtreten kann, müssen sich die Wellen aus verschiedenen Intervallen in Phase addieren. Das Durchgangsspektrum eines idealen Bragg-Gitters mit 50 Schichten und einem Reflexionsvermögen von 0,1% ist unten gezeigt.

Der folgende Code generiert Daten für dieses Diagramm:
ld = np.linspace(ld_center-3e-9, ld_center+3e-9, num_ld) k = 2*np.pi/ld T = np.ones(ld.shape) for j in range(num_layers): T = T*(1-A)*np.cos(j*k*layer_sep)**2
Hier berechnen wir explizit die relativen Beiträge jeder Lücke, ausgedrückt in optischer Leistung, die die nächste Lücke erreichen. Konstruktive und destruktive Interferenzen werden berücksichtigt, indem der Beitrag der Lücke verringert oder erhöht wird, je nachdem, wie eng der Abstand zwischen den Schichten mit der halben Wellenlänge übereinstimmt.
Dieser Hack ist notwendig, weil die Verbindung von Qubits nur in reellen Zahlen und nicht in komplexen Zahlen ausgedrückt wird (Physik wird am besten durch komplexe Zahlen ausgedrückt, die die Amplitude und Phase des Lichts enthalten). Trotzdem sieht die Ausgabe des klassischen Codes ungefähr korrekt aus - das Fehlen von Seitenfrequenzbändern macht ein wenig Sorgen, was auf die Unvollständigkeit des Modells hinweist, aber bisher spielt es keine Rolle.
Dem klassischen Modellcode fehlen Konsistenzprüfungen. Ich berechnete das Ergebnis und schlug genau vor, wie sich die Welle ausbreiten würde. Selbst wenn sich diese Annahme als falsch herausstellt, ist das Berechnungsergebnis dasselbe - obwohl alle Gleichungen auf der Physik basieren, kann im Code nicht garantiert werden, dass sie es korrekt beschreiben.
Wir gehen zu Quanten über
Im D-Wave-System muss eine Kette von Qubits erstellt werden, von denen jedes die Lichtintensität in der Lücke darstellt. Jedes Qubit ist seinen Nachbarn zugeordnet, und das Gewicht der Verbindung repräsentiert den Übergang von einer Lücke zur anderen unter Berücksichtigung des Abstands zwischen den Schnittstellen. Wenn der Abstand zwischen den Grenzflächen gleich der halben Wellenlänge ist, kann Licht zwischen den beiden Grenzflächen schwingen und weitergeben. Wenn der Abstand ein Viertel der Wellenlänge beträgt, wird eine destruktive Interferenz ausgelöst, und die Verbindung sollte minimal sein.
Das Durchlaufen einer Lücke wird in 99,9% angegeben, sodass die Verbindung zwischen dem Null- und dem ersten Qubit besteht
Zwischen dem ersten und dem zweiten:
Zwischen dem zweiten und dritten:
In dieser Formel ist d der physikalische Abstand zwischen den Schichten und λ ist die Wellenlänge. Wenn d / λ = 0,5 ist, ist der Kosinus gleich Eins, und wir können auf die ideale Lichtdurchlässigkeit hoffen.
Im D-Wave-System bedeutet dies, dass alle zwei benachbarten Qubits wie folgt verbunden werden müssen:
In diesem Ausdruck berücksichtigt der Grad u den Einfluss vorheriger Qubits und vereinfacht das Verbindungsschema.
Aufgabenimplementierung
Nachdem wir nun wissen, wie Qubits verbunden werden, müssen wir uns die physische Verbindung von Qubits ansehen, um zu entscheiden, wie diese Aufgabe ausgeführt werden soll. Dies wird als geringfügige Einbettung bezeichnet.
Wir müssen dem Computer eine Liste der Verbindungen zwischen Qubits mit ihren Gewichten geben. Wir müssen auch Abweichungen angeben, die die Wichtigkeit jedes Qubits angeben. In unserem Fall sind alle Qubits gleich wichtig, daher werden sie für alle Qubits auf -1 gesetzt (ich habe diese Zahl aus dem Standardbeispiel genommen). Abweichungen und Verbindungen müssen mit physischen Qubits und den Beziehungen zwischen ihnen verbunden sein. Bei großen Aufgaben kann die Suche nach einer solchen Zuordnung lange dauern.
Der Code zum Generieren von Beziehungen und Abweichungen ist ziemlich einfach.
Glücklicherweise wird die D-Wave-API versuchen, selbst eine kleine Implementierung zu finden. Ich fand, dass es für einen Filter mit 50 Schichten funktionierte, aber nicht mit 100 Schichten fertig wurde. Dies erscheint mir ziemlich seltsam, da das System mit 2.000 Qubits und einer Kettenlänge von 1 (wir müssen nicht mehrere physische Qubits kombinieren, um ein logisches zu erstellen) in der Lage sein muss, noch größere Probleme zu implementieren. Rückblickend glaube ich, dass der Fehler darauf zurückzuführen ist, dass ich zu viele Nullverbindungen angefragt habe.
Ein alternativer Ansatz besteht einfach darin, Nullbindungen nicht explizit zu definieren. Dies gibt dem Algorithmus die Freiheit, mehr Implementierungsoptionen zu finden, bei denen Qubits keine Verbindungen haben. Ich habe dies nicht versucht, aber diese Option scheint mir der nächste logische Schritt zu sein.
In jedem Fall ist das Starten der D-Wave-Maschine sehr einfach:
response = EmbeddingComposite(DWaveSampler()).sample_qubo(Q_auto, num_reads=num_runs)
Cubitly sprechen lernen
Der Unterschied zwischen meinem klassischen Algorithmus und der D-Wave-Lösung besteht darin, dass der D-Wave-Computer kein direktes Ergebnis direkt zurückgibt. Es stellt sich heraus, in viele Teile zerbrochen. Wir bekommen eine Liste von Energien, und die kleinste davon sollte die Lösung sein. Für mehrere Läufe (sagen wir 1000) für jede Energie erhalten wir die Häufigkeit, mit der sie in der Antwort angezeigt wurde. Und für jeden Lauf erhalten wir eine „Antwort“, den Wert von Qubits. Mir war nicht sofort klar, welcher dieser Werte so interpretiert werden kann (und kann), dass er einen Filter durchläuft.
Am Ende entschied ich, dass die minimale Lösungsenergie die beste Antwort ist, da dieser Wert in gewissem Sinne die im Filter gespeicherte Energiemenge darstellt. Daher stellt eine Lösung mit höherer Energie eine größere Permeabilität des Filters dar, wie unten gezeigt. Diese Antwort in eine echte Lichtpassage zu verwandeln, bleibt als Hausaufgabe für diejenigen, die dies verstehen.

Es ist auch möglich, eine physikalische Darstellung des Prozesses zu erhalten, indem die Werte von Qubits in einer Lösung mit der niedrigsten Energie untersucht werden. Unten sehen Sie die Bitwerte der Lösungen, die dem Peak der Transmissionskurve (500 nm), 50% Transmission (500,6 nm) und 5% Transmission (501,4 nm) entsprechen.

Am Rand des Übertragungspeaks neigen Qubits dazu, sich in Gruppen von Einheiten anzusammeln. In der Spitze wechseln sich die Qubits zwischen 0 und 1 ab. Diese letzte Lösung ist ein binäres Bild davon, wie sich die Lichtintensität im Bragg-Gitter ändert. Mit anderen Worten, die D-Wave-Lösung präsentiert die Physik auch direkt, was über meinen klassischen Code nicht gesagt werden kann.
Dies ist die wahre Stärke des Quantenglühens. Ja, ich kann die Kurve des Durchlaufens des Filters perfekt aus klassischen Berechnungen ableiten. Aber um ein Bild davon zu bekommen, was wirklich im Inneren passiert, benötigen Sie komplexeren Code. Und beim Quantenglühen ist dies völlig kostenlos. Meiner Meinung nach ist das sehr cool.
Ein weiterer Vorteil des Quantenglühens besteht darin, dass es eine konsistente Lösung im Rahmen meiner Wahl der Qubit-Bindungsgewichte garantiert. Dies bedeutet, dass die Lösung eines Quantencomputers wahrscheinlich zuverlässiger ist als die aus klassischem Code erhaltene Lösung.
Diskussionen über Quantenprogrammierung
Das Schwierigste an der Programmierung einer D-Wave-Maschine ist, dass Sie bei Aufgaben anders denken müssen. Zum Beispiel habe ich mich an Minimierungsprobleme gewöhnt, wenn die Kurve mit den Daten übereinstimmt. Aber ich fand es sehr schwierig, die Art und Weise, wie Sie über ein physisches Problem denken, so zu ändern, dass Sie anfangen, Code zu schreiben, um es zu lösen. Es hilft nicht, dass die meisten Beispiele des Unternehmens abstrakt und für mich nicht an körperliche Probleme anpassbar erscheinen. Diese Situation wird sich jedoch ändern, wenn immer mehr Benutzer ihren Code veröffentlichen.
Es können auch Schwierigkeiten bei der Interpretation der Antwort auftreten. Grundsätzlich hat mir die Einfachheit der API gefallen, und es ist großartig, zusätzliche Ideen kostenlos zu erhalten. In naher Zukunft könnte ich D-Wave verwenden, um echte Probleme zu lösen.