Как правильно управлять временем жизни Qubit в C # - PullRequest
0 голосов
/ 30 июня 2018

Я играю с Q #, который использует C # в качестве драйвера. Я хотел бы передать объект Qubit в код Q #, но он не работает должным образом.

C # Драйвер

using Microsoft.Quantum.Simulation.Core;
using Microsoft.Quantum.Simulation.Simulators;

namespace Quantum.QSharpApplication1 {
    class Driver {
        static void Main(string[] args) {
            using (var sim = new QuantumSimulator()) {
                var x = new Microsoft.Quantum.Simulation.Common.QubitManager(10);
                Qubit q1 = x.Allocate();
                Solve.Run(sim, q1, 1);
                }
            System.Console.WriteLine("Press any key to continue...");
            System.Console.ReadKey();
            }
        }
    }

Q #

namespace Quantum.QSharpApplication1
{
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;

operation Solve (q : Qubit, sign : Int) : ()
    {
        body
        {
            let qp = M(q);
            if (qp != Zero)
            {
                X(q);
            }     
            H(q);
        }
    }
}

Когда я запускаю это, он работает без ошибок, пока не достигнет строк System.Console. *, И в этот момент он выдает следующее исключение в коде Q #

System.AccessViolationException
  HResult=0x80004003
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

Отладчик связывает это с «let qp = M (q);» строка в Q #.

Обратите внимание, что это происходит в вызове Solve.Run, в реальном коде есть несколько вызовов Solve, и результат отображается правильно. Похоже, это происходит только после того, как область применения QuantumSimulator оставлена. Я помню, что читал, что Qubit должен быть сброшен на ноль, прежде чем он будет выпущен. Я не уверен, в этом ли проблема, но я не вижу способа сделать это в C #. Интересно, я удалил строки консоли, программа будет работать без ошибок (время?).

1 Ответ

0 голосов
/ 02 июля 2018

Экземпляр QubitManager, который вы использовали для создания кубитов, не является единичным (у каждого Simulator есть свой QubitManager), поэтому Simulator не знает о Qubit, которую вы пытаетесь манипулировать Код Q #, таким образом, AccessViolationException.

Как правило, создание Qubits на драйвере не поддерживается; вы можете только распределять кубиты, используя операторы allocate и borrowing внутри Q #. Рекомендуется создать точку входа в Q # для выделения кубитов, которые выполняют распределение кубитов, и вызвать это из драйвера, например:

// MyOp.qs
operation EntryPoint() : () 
{
    body
    {
        using (register = Qubit[2]) 
        {
            myOp(register);
        }
    }
}


// Driver.cs
EntryPoint.Run().Wait();

Наконец, обратите внимание, что в вашем коде драйвера есть следующее: Solve.Run(sim, q1, 1);

Метод Run возвращает задачи, которые выполняются асинхронно. Обычно вы должны добавить Wait(), чтобы убедиться, что он заканчивает выполнение: EntryPoint.Run(sim, 1).Wait();

Если вы сделаете это, вы заметите эту ошибку во время Run, а не Console.WriteLine.

...