Quantensimulatoren und HostanwendungenQuantum simulators and host applications

Sie lernen FolgendesWhat You'll Learn

  • Ausführen von QuantenalgorithmenHow quantum algorithms are executed
  • Quantensimulatoren in diesem ReleaseWhat quantum simulators are included in this release
  • Schreiben eines C#-Treibers für Ihren QuantenalgorithmusHow to write a C# driver for your quantum algorithm

Modell für die Quantum Development Kit-AusführungThe Quantum Development Kit Execution Model

Unter Schreiben eines Quantenprogramms haben wir unseren Quantenalgorithmus ausgeführt, indem wir ein QuantumSimulator-Objekt an die Run-Methode der Algorithmusklasse übergeben haben.In Writing a quantum program, we executed our quantum algorithm by passing a QuantumSimulator object to the algorithm class's Run method. Die QuantumSimulator-Klasse führt den Quantenalgorithmus aus, indem der Quantenzustandsvektor vollständig simuliert wird. Dies ist der perfekte Ansatz für das Ausführen und Testen von Teleport.The QuantumSimulator class executes the quantum algorithm by fully simulating the quantum state vector, which is perfect for running and testing Teleport. Weitere Informationen zu Quantenzustandsvektoren finden Sie im Leitfaden zu den Konzepten.See the Concepts guide for more on quantum state vectors.

Andere Zielcomputer können verwendet werden, um einen Quantenalgorithmus auszuführen.Other target machines may be used to run a quantum algorithm. Der Computer ist für das Bereitstellen der Implementierungen von Quantenprimitiven für den Algorithmus zuständig.The machine is responsible for providing implementations of quantum primitives for the algorithm. Dies gilt auch für primitive Vorgänge, z. B. H, CNOT und Measure, sowie für die Verwaltung und Nachverfolgung von Qubits.This includes primitive operations such as H, CNOT, and Measure, as well as qubit management and tracking. Verschiedene Klassen von Quantencomputern stehen für unterschiedliche Ausführungsmodelle desselben Quantenalgorithmus.Different classes of quantum machines represent different execution models for the same quantum algorithm.

Mit jeder Art von Quantencomputer können unterschiedliche Implementierungen dieser Primitive bereitgestellt werden.Each type of quantum machine may provide different implementations of these primitives. Mit dem Simulator für die Nachverfolgung von Quantencomputern, der im Development Kit enthalten ist, werden beispielsweise keine Simulationen durchgeführt.For instance, the quantum computer trace simulator included in the development kit doesn't do any simulation at all. Stattdessen wird hiermit die Nutzung von Gates, Qubits und anderen Ressourcen für den Algorithmus nachverfolgt.Rather, it tracks gate, qubit, and other resource usage for the algorithm.

QuantencomputerQuantum Machines

Für die Zukunft ist die Definition weiterer Quantencomputerklassen geplant, um andere Arten von Simulationen und die Ausführung auf topologischen Quantencomputern zu unterstützen.In the future, we will define additional quantum machine classes to support other types of simulation and to support execution on topological quantum computers. Indem der Algorithmus konstant gehalten wird, während die zugrunde liegende Computerimplementierung variiert, wird das Testen und Debuggen eines simulierten Algorithmus vereinfacht. Anschließend können Sie beim Ausführen auf echter Hardware sicher sein, dass sich der Algorithmus nicht geändert hat.Allowing the algorithm to stay constant while varying the underlying machine implementation makes it easy to test and debug an algorithm in simulation and then run it on real hardware with confidence that the algorithm hasn't changed.

Was ist in diesem Release enthalten?What's Included in this Release

Dieses Release des Quantum Developer Kit umfasst mehrere Quantencomputerklassen.This release of the quantum developer kit includes several quantum machine classes. Diese sind im Namespace Microsoft.Quantum.Simulation.Simulators definiert.All of them are defined in the Microsoft.Quantum.Simulation.Simulators namespace.

Schreiben einer HostanwendungWriting a host application

Unter Schreiben eines Quantenprogramms haben wir einen einfachen C#-Treiber für unseren Teleportalgorithmus geschrieben.In Writing a quantum program, we wrote a simple C# driver for our teleport algorithm. Ein C#-Treiber hat vier Hauptaufgaben:A C# driver has 4 main purposes:

  • Erstellen des ZielcomputersConstructing the target machine
  • Berechnen aller Argumente, die für den Quantenalgorithmus erforderlich sindComputing any arguments required for the quantum algorithm
  • Ausführen des Quantenalgorithmus mit dem SimulatorRunning the quantum algorithm using the simulator
  • Verarbeiten des VorgangsergebnissesProcessing the result of the operation

Hier werden die einzelnen Schritte ausführlicher beschrieben.Here we'll discuss each step in more detail.

Erstellen des ZielcomputersConstructing the Target Machine

Quantencomputer sind Instanzen normaler .NET-Klassen. Sie werden also genauso wie .NET-Klassen erstellt, indem ihr Konstruktor aufgerufen wird.Quantum machines are instances of normal .NET classes, so they are created by invoking their constructor, just like any .NET class. Da von einigen Simulatoren, z. B. QuantumSimulator, die System.IDisposable-.NET-Schnittstelle implementiert wird, sollten diese mit einer C#-Anweisung vom Typ using umschlossen werden.Some simulators, including the QuantumSimulator, implement the .NET System.IDisposable interface, and so should be wrapped in a C# using statement.

Berechnen von Argumenten für den AlgorithmusComputing Arguments for the Algorithm

Im Teleport-Beispiel haben wir einige etwas künstliche Argumente für die Übergabe an unseren Quantenalgorithmus berechnet.In our Teleport example, we computed some relatively artificial arguments to pass to our quantum algorithm. Typischer ist aber, dass für den Quantenalgorithmus umfangreiche Daten benötigt werden, die am einfachsten über den klassischen Treiber bereitgestellt werden können.More typically, however, there is significant data required by the quantum algorithm, and it is easiest to provide it from the classical driver.

Beim Durchführen von chemischen Simulationen ist für den Quantenalgorithmus beispielsweise eine umfassende Tabelle mit Molekülorbital-Interaktionsintegralen erforderlich.For instance, when doing chemical simulations, the quantum algorithm requires a large table of molecular orbital interaction integrals. Normalerweise werden diese Daten aus einer Datei eingelesen, die beim Ausführen des Algorithmus angegeben wird.Generally these are read in from a file that is provided when running the algorithm. Da Q# nicht über einen Mechanismus für den Zugriff auf das Dateisystem verfügt, ist es am besten, diese Daten über den klassischen Treiber zu erfassen und dann an die Run-Methode des Quantenalgorithmus zu übergeben.Since Q# does not have a mechanism for accessing the file system, this sort of data is best collected by the classical driver and then passed to the quantum algorithm's Run method.

Ein weiterer Fall, in dem der klassische Treiber eine wichtige Rolle spielt, sind Variationsmethoden.Another case where the classical driver plays a key role is in variational methods. Bei dieser Klasse von Algorithmen wird basierend auf einigen klassischen Parametern ein Quantenzustand vorbereitet, der dann zum Berechnen eines benötigten Werts verwendet wird.In this class of algorithms, a quantum state is prepared based on some classical parameters, and that state is used to compute some value of interest. Die Parameter werden basierend auf einer Art von Bergsteiger- oder Machine Learning-Algorithmus angepasst, und der Quantenalgorithmus wird erneut ausgeführt.The parameters are adjusted based on some type of hill climbing or machine learning algorithm and the quantum algorithm run again. Bei Algorithmen dieser Art wird der Bergsteigeralgorithmus selbst am besten als reine klassische Funktion implementiert, die vom klassischen Treiber aufgerufen wird. Die Ergebnisse des Bergsteigervorgangs werden dann an die nächste Ausführung des Quantenalgorithmus übergeben.For such algorithms, the hill climbing algorithm itself is best implemented as a purely classical function that is called by the classical driver; the results of the hill climbing are then passed to the next execution of the quantum algorithm.

Ausführen des QuantenalgorithmusRunning the Quantum Algorithm

Dieser Teil ist im Allgemeinen nicht sehr kompliziert.This part is generally very straightforward. Jeder Q#-Vorgang wird zu einer Klasse kompiliert, die eine statische Run-Methode bereitstellt.Each Q# operation is compiled into a class that provides a static Run method. Die Argumente für diese Methode werden vom vereinfachten Argumenttupel des Vorgangs selbst bereitgestellt – sowie ein weiteres erstes Argument, bei dem es sich um den Simulator für die Ausführung handelt.The arguments to this method are given by the flattened argument tuple of the operation itself, plus an additional first argument which is the simulator to execute with. Für einen Vorgang, für den das benannte Tupel vom Typ (a: String, (b: Double, c: Double)) erwartet wird, hat das vereinfachte Gegenstück den Typ (String a, Double b, Double c).For an operation that expects the named tuple of type (a: String, (b: Double, c: Double)) its flattened counterpart is of type (String a, Double b, Double c).

Beim Übergeben von Argumenten an eine Run-Methode sind einige Besonderheiten zu beachten:There are some subtleties when passing arguments to a Run method:

  • Arrays müssen mit einem Microsoft.Quantum.Simulation.Core.QArray<T>-Objekt umschlossen sein.Arrays must be wrapped in a Microsoft.Quantum.Simulation.Core.QArray<T> object. Eine QArray-Klasse verfügt über einen Konstruktor, für den eine beliebige sortierte Sammlung (IEnumerable<T>) mit geeigneten Objekten verwendet werden kann.A QArray class has a constructor that can take any ordered collection (IEnumerable<T>) of appropriate objects.
  • Das leere Tupel (() in Q#) wird in C# mit QVoid.Instance dargestellt.The empty tuple, () in Q#, is represented by QVoid.Instance in C#.
  • Tupel, die nicht leer sind, werden als ValueTuple-.NET-Instanzen dargestellt.Non-empty tuples are represented as .NET ValueTuple instances.
  • Benutzerdefinierte Q#-Typen werden als Basistyp übergeben.Q# user-defined types are passed as their base type.
  • Zum Übergeben eines Vorgangs oder einer Funktion an eine Run-Methode müssen Sie eine Instanz der Vorgangs- oder Funktionsklasse abrufen, indem Sie die Get<>-Methode des Simulators verwenden.To pass an operation or a function to a Run method, you have to obtain an instance of the operation's or function's class, using the simulator's Get<> method.

Verarbeiten der ErgebnisseProcessing the Results

Die Ergebnisse des Quantenalgorithmus werden von der Run-Methode zurückgegeben.The results of the quantum algorithm are returned from the Run method. Da die Run-Methode asynchron ausgeführt wird, gibt sie eine Instanz von Task<TResult> zurück.The Run method executes asynchronously thus it returns an instance of Task<TResult>. Es gibt mehrere Möglichkeiten, die Ergebnisse des tatsächlichen Vorgangs zu erhalten.There are multiple ways to get the actual operation's results. Der einfachste Weg ist die Verwendung der Result-Eigenschaft der Task:The simplest is by using the Task's Result property:

    var res = BellTest.Run(sim, 1000, initial).Result;

Andere Verfahren, z. B. die Wait-Methode oder das C#-Schlüsselwort await, funktionieren ebenfalls.but other techniques, like using the Wait method or C# await keyword will also work.

Wie auch bei Argumenten, werden Q#-Tupel als ValueTuple-Instanzen und Q#-Arrays als QArray-Instanzen dargestellt.As with arguments, Q# tuples are represented as ValueTuple instances and Q# arrays are represented as QArray instances. Benutzerdefinierte Typen werden als Basistypen zurückgegeben.User-defined types are returned as their base types. Das leere Tupel () wird als Instanz der QVoid-Klasse zurückgegeben.The empty tuple, (), is returned as an instance of the QVoid class.

Für viele Quantenalgorithmen ist eine umfangreiche Nachbearbeitung erforderlich, um nützliche Antworten zu erhalten.Many quantum algorithms require substantial post-processing to derive useful answers. Der Quantenteil des Shor-Algorithmus ist beispielsweise nur der Anfang einer Berechnung, bei der die Faktoren einer Zahl ermittelt werden.For instance, the quantum part of Shor's algorithm is just the beginning of a computation that finds the factors of a number.

In den meisten Fällen ist es am einfachsten, diese Art der Nachbearbeitung über den klassischen Treiber durchzuführen.In most cases, it is simplest and easiest to do this sort of post-processing in the classical driver. Nur mit dem klassischen Treiber können Ergebnisse an den Benutzer gemeldet oder auf Datenträger geschrieben werden.Only the classical driver can report results to the user or write them to disk. Der klassische Treiber verfügt über Zugriff auf Analysebibliotheken und andere mathematische Funktionen, die in Q# nicht verfügbar gemacht werden.The classical driver will have access to analytical libraries and other mathematical functions that are not exposed in Q#.

FehlerFailures

Wenn bei der Ausführung eines Vorgangs die Q#-Anweisung fail erreicht wird, wird ExecutionFailException ausgelöst.When the Q# fail statement is reached during the execution of an operation, an ExecutionFailException is thrown.

Aufgrund der Verwendung von System.Task in der Run-Methode ist die Ausnahme, die aufgrund einer fail-Anweisung ausgelöst wird, von System.AggregateException umschlossen.Due to the use of System.Task in the Run method, the exception thrown as a result of a fail statement will be wrapped into a System.AggregateException. Zum Ermitteln der tatsächlichen Ursache des Fehlers müssen Sie eine Iteration in AggregateException InnerExceptions durchführen. Beispiel:To find the actual reason for the failure, you need to iterate into the AggregateException InnerExceptions, for example:


            try
            {
                using(var sim = new QuantumSimulator())
                {
                    /// call your operations here...
                }
            }
            catch (AggregateException e)
            {
                // Unwrap AggregateException to get the message from Q# fail statement.
                // Go through all inner exceptions.
                foreach (Exception inner in e.InnerExceptions)
                {
                    // If the exception of type ExecutionFailException
                    if (inner is ExecutionFailException failException)
                    {
                        // Print the message it contains
                        Console.WriteLine($" {failException.Message}");
                    }
                }
            }

Andere klassische SprachenOther Classical Languages

Die bereitgestellten Beispiele gelten für C#, F# und Python, aber das Quantum Development Kit unterstützt auch das Schreiben klassischer Hostprogramme in anderen Sprachen.While the samples we have provided are in C#, F#, and Python, the Quantum Development Kit also supports writing classical host programs in other languages. Wenn Sie beispielsweise ein Hostprogramm in Visual Basic schreiben möchten, sollte dies problemlos funktionieren.For example, if you want to write a host program in Visual Basic, it should work just fine.