Kuantum simülatörleri ve konak uygulamalarıQuantum simulators and host applications

ÖğreneceklerinizWhat You'll Learn

  • Kuantum algoritmalar nasıl yürütülür?How quantum algorithms are executed
  • Bu sürüme dahil olan kuantum simülatörlerWhat quantum simulators are included in this release
  • Kuantum algoritmanız için bir C# sürücüsü yazmaHow to write a C# driver for your quantum algorithm

Kuantum Geliştirme Seti Yürütme ModeliThe Quantum Development Kit Execution Model

Kuantum program yazma bölümünde bir QuantumSimulator nesnesini algoritma sınıfının Run yöntemine geçirerek kuantum algoritmamızı yürüttük.In Writing a quantum program, we executed our quantum algorithm by passing a QuantumSimulator object to the algorithm class's Run method. QuantumSimulator sınıfı, Teleport çalıştırmak ve test etmek için mükemmel olan kuantum durum vektörünü tamamen taklit ederek kuantum algoritmasını yürütür.The QuantumSimulator class executes the quantum algorithm by fully simulating the quantum state vector, which is perfect for running and testing Teleport. Kuantum durum vektörleri hakkında daha fazla bilgi için bkz. Kavramlar kılavuzu.See the Concepts guide for more on quantum state vectors.

Diğer hedef makineler bir kuantum algoritması çalıştırmak için kullanılabilir.Other target machines may be used to run a quantum algorithm. Makine, algoritma için kuantum temel elemanlarının uygulamasını sağlamaktan sorumludur.The machine is responsible for providing implementations of quantum primitives for the algorithm. Buna H, CNOT ve Measure gibi temel eleman işlemlerinin yanı sıra kuantum bit yönetimi ve izlemesi dahildir.This includes primitive operations such as H, CNOT, and Measure, as well as qubit management and tracking. Farklı kuantum makine sınıfları, aynı kuantum algoritması için farklı yürütme modellerini temsil eder.Different classes of quantum machines represent different execution models for the same quantum algorithm.

Her kuantum makine türü, bu temel elemanların farklı uygulamalarını sağlayabilir.Each type of quantum machine may provide different implementations of these primitives. Örneğin, geliştirme setine dahil olan kuantum bilgisayar iz simülatörü hiçbir simülasyon yapmaz.For instance, the quantum computer trace simulator included in the development kit doesn't do any simulation at all. Bunun yerine algoritmaya ait geçit, kuantum bit ve diğer kaynak kullanımını izler.Rather, it tracks gate, qubit, and other resource usage for the algorithm.

Kuantum MakinelerQuantum Machines

Gelecekte diğer simülasyon türlerini destekleyen ve topolojik kuantum bilgisayarlar üzerinde yürütmeyi destekleyen başka kuantum makine sınıfları tanımlayacağız.In the future, we will define additional quantum machine classes to support other types of simulation and to support execution on topological quantum computers. Temel alınan makine uygulamasını değiştirirken algoritmanın sabit kalmasına izin vermek, simülasyondaki bir algoritmayı test etme ve hata ayıklama işlemlerini kolaylaştırır ve sonra algoritmanın değişmediğinden emin olarak gerçek donanım üzerinde rahatça çalıştırılır.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.

Bu Yayına Dahil Olan ÖzelliklerWhat's Included in this Release

Kuantum geliştirici setinin bu yayını birkaç kuantum makine sınıfı içerir.This release of the quantum developer kit includes several quantum machine classes. Bu sınıfların tümü Microsoft.Quantum.Simulation.Simulators ad alanında tanımlanmıştır.All of them are defined in the Microsoft.Quantum.Simulation.Simulators namespace.

Konak uygulama yazmaWriting a host application

Kuantum program yazma bölümünde teleport algoritmamız için basit bir C# sürücüsü yazmıştık.In Writing a quantum program, we wrote a simple C# driver for our teleport algorithm. Bir C# sürücüsünün başlıca 4 amacı vardır:A C# driver has 4 main purposes:

  • Hedef makineyi oluşturmaConstructing the target machine
  • Kuantum algoritması için gereken tüm bağımsız değişkenleri hesaplamaComputing any arguments required for the quantum algorithm
  • Simülatörü kullanarak kuantum algoritması çalıştırmaRunning the quantum algorithm using the simulator
  • İşlemin sonucunu işlemeProcessing the result of the operation

Burada her adımı daha ayrıntılı olarak ele alacağız.Here we'll discuss each step in more detail.

Hedef Makineyi OluşturmaConstructing the Target Machine

Kuantum makineler normal .NET sınıfı örnekleridir, bu nedenle herhangi bir .NET sınıfı gibi oluşturucularını çağırarak oluşturulurlar.Quantum machines are instances of normal .NET classes, so they are created by invoking their constructor, just like any .NET class. QuantumSimulator dahil bazı simülatörler .NET System.IDisposable arabirimini uygular ve bu yüzden bir C# using deyimine sarmalanmalıdır.Some simulators, including the QuantumSimulator, implement the .NET System.IDisposable interface, and so should be wrapped in a C# using statement.

Algoritma Bağımsız Değişkenlerini HesaplamaComputing Arguments for the Algorithm

Teleport örneğimizde, kuantum algoritmamıza geçirilecek bazı görece yapay bağımsız değişkenleri hesaplandık.In our Teleport example, we computed some relatively artificial arguments to pass to our quantum algorithm. Bununla birlikte, genellikle kuantum algoritması önemli veriler gerektirir ve bu verileri klasik sürücüden sağlamak en kolay yoldur.More typically, however, there is significant data required by the quantum algorithm, and it is easiest to provide it from the classical driver.

Örneğin, kimyasal simülasyonlar yaparken kuantum algoritması büyük bir moleküler orbital etkileşim tam sayıları tablosu gerektirir.For instance, when doing chemical simulations, the quantum algorithm requires a large table of molecular orbital interaction integrals. Bunlar genellikle algoritma çalıştırılırken sağlanan bir dosyadan okunurlar.Generally these are read in from a file that is provided when running the algorithm. Q# dilinin dosya sistemine erişmeye yönelik bir mekanizması bulunmadığı için, bu tür verileri toplamanın en iyi yolu klasik sürücüdür ve bu veriler kuantum algoritmasının Run yöntemine geçirilir.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.

Klasik sürücünün anahtar rol oynadığı başka bir durum ise değişimli yöntemlerde yaşanır.Another case where the classical driver plays a key role is in variational methods. Bu algoritma sınıfında bazı klasik parametreler temel alınarak bir kuantum durumu hazırlanır ve bu durum, bazı ilgili değerleri hesaplamak için kullanılır.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. Parametreler bazı tırmanma veya makine öğrenmesi algoritması türleri temel alınarak ayarlanır ve kuantum algoritması tekrar çalışır.The parameters are adjusted based on some type of hill climbing or machine learning algorithm and the quantum algorithm run again. Bu tür algoritmalar için tırmanma algoritmasını uygulamanın en iyi yolu, klasik sürücü tarafından çağrılan tamamen klasik bir işlev olarak uygulamaktır. Tırmanma sonuçları daha sonra kuantum algoritmasının sonraki yürütme işlemine geçirilir.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.

Kuantum Algoritmasını ÇalıştırmaRunning the Quantum Algorithm

Bu bölüm genellikle çok basittir.This part is generally very straightforward. Her Q# işlemi statik bir Run yöntemi sağlayan bir sınıfta derlenir.Each Q# operation is compiled into a class that provides a static Run method. Bu yöntemin bağımsız değişkenleri, işlemin düzleştirilmiş bağımsız değişken demeti tarafından verilir ve ek olarak, yürütülecek simülatörü oluşturan bir birinci bağımsız değişken daha bulunur.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. (a: String, (b: Double, c: Double)) türünde adlandırılmış demeti bekleyen bir işlemin düzleştirilmiş karşılığı (String a, Double b, Double c) türündedir.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).

Bağımsız değişkenleri bir Run yöntemine geçirirken uygulanacak bazı incelikler vardır:There are some subtleties when passing arguments to a Run method:

  • Diziler bir Microsoft.Quantum.Simulation.Core.QArray<T> nesnesine sarmalanmış olmalıdır.Arrays must be wrapped in a Microsoft.Quantum.Simulation.Core.QArray<T> object. QArray sınıfı, uygun nesnelerin sıralanmış herhangi bir koleksiyonunu (IEnumerable<T>) alabilen bir oluşturucuya sahiptir.A QArray class has a constructor that can take any ordered collection (IEnumerable<T>) of appropriate objects.
  • Q# dilinde () olan boş demet, C# dilinde QVoid.Instance ile temsil edilir.The empty tuple, () in Q#, is represented by QVoid.Instance in C#.
  • Boş olmayan demetler .NET ValueTuple örnekleri olarak temsil edilir.Non-empty tuples are represented as .NET ValueTuple instances.
  • Kullanıcı tanımlı Q# türleri, temel tür olarak geçirilir.Q# user-defined types are passed as their base type.
  • Bir işlemi veya işlevi Run yöntemine geçirmek için, simülatörün Get<> yöntemini kullanarak işlemin veya işlevin sınıfının bir örneğini elde etmeniz gerekir.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.

Sonuçları İşlemeProcessing the Results

Kuantum algoritmasının sonuçları Run yönteminden döndürülür.The results of the quantum algorithm are returned from the Run method. Run yöntemi zaman uyumsuz olarak yürütülür, bu nedenle bir Task<TResult> örneği döndürür.The Run method executes asynchronously thus it returns an instance of Task<TResult>. Gerçek işlemin sonuçlarını almanın birden çok yolu vardır.There are multiple ways to get the actual operation's results. En basit yol, Task yönteminin Result özelliğini kullanmaktır:The simplest is by using the Task's Result property:

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

Ancak Wait yöntemini veya C# await anahtar sözcüğünü kullanmak gibi diğer teknikler de işe yarar.but other techniques, like using the Wait method or C# await keyword will also work.

Bağımsız değişkenlerde olduğu gibi, Q# demetleri ValueTuple örnekleri ve Q# dizileri QArray örnekleri olarak temsil edilir.As with arguments, Q# tuples are represented as ValueTuple instances and Q# arrays are represented as QArray instances. Kullanıcı tanımlı türler, temel türleri olarak döndürülür.User-defined types are returned as their base types. () boş demeti, QVoid sınıfının bir örneği olarak döndürülür.The empty tuple, (), is returned as an instance of the QVoid class.

Birçok kuantum algoritması yararlı yanıtlar elde etmek için önemli miktarda son işlem gerektirir.Many quantum algorithms require substantial post-processing to derive useful answers. Örneğin, Shor algoritmasının kuantum kısmı, bir sayının faktörlerini bulan hesaplamanın yalnızca başlangıcıdır.For instance, the quantum part of Shor's algorithm is just the beginning of a computation that finds the factors of a number.

Çoğu durumda, bu son işlemi klasik sürücüde yapmak daha basit ve kolaydır.In most cases, it is simplest and easiest to do this sort of post-processing in the classical driver. Yalnızca klasik sürücü sonuçları kullanıcıya bildirebilir veya diske yazabilir.Only the classical driver can report results to the user or write them to disk. Klasik sürücü, analitik kitaplıklara ve Q# içinde gösterilmeyen diğer matematiksel işlevlere erişebilir.The classical driver will have access to analytical libraries and other mathematical functions that are not exposed in Q#.

HatalarFailures

Bir işlemin yürütülmesi sırasında Q# fail deyimine ulaşıldığında bir ExecutionFailException oluşturulur.When the Q# fail statement is reached during the execution of an operation, an ExecutionFailException is thrown.

Run yönteminde System.Task kullanılması nedeniyle, fail deyiminin sonucu olarak oluşturulan özel durum bir System.AggregateException içine sarmalanmalıdır.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. Hatanın gerçek nedenini bulmak için AggregateException InnerExceptionsiçinde tekrarlamanız gerekir, örneğin: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}");
                    }
                }
            }

Diğer Klasik DillerOther Classical Languages

Sağladığımız örnekler C#, F# ve Python dillerinde olsa da Kuantum Geliştirme Seti diğer dillerde klasik ana bilgisayar programları yazmayı da destekler.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. Örneğin, Visual Basic’te bir ana bilgisayar programı yazmak istiyorsanız sorunsuzca çalışmalıdır.For example, if you want to write a host program in Visual Basic, it should work just fine.