如何在 C# 中正确管理 Qubit 的生命周期
How do I properly manage the lifetime of a Qubit in C#
我正在玩 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# 中执行此操作的方法。有趣的是,我删除了控制台行,程序将 运行 没有错误(计时?)。
您用来创建量子位的 QubitManager
实例不是单例(每个 Simulator
都有自己的 QubitManager
),因此 Simulator
不知道Qubit
你试图操纵 Q# 代码,因此 AccessViolationException
.
一般情况下,不支持在驱动上创建量子比特;您可以在 Q# 中使用 only allocate qubits using the allocate
and borrowing
语句。建议在 Q# 中创建一个入口点来分配执行量子比特分配的量子比特,并从驱动程序中调用它,例如:
// MyOp.qs
operation EntryPoint() : ()
{
body
{
using (register = Qubit[2])
{
myOp(register);
}
}
}
// Driver.cs
EntryPoint.Run().Wait();
最后,请注意在您的驱动程序代码中您有:
Solve.Run(sim, q1, 1);
Run
方法returns一个异步执行的任务。您通常必须添加一个 Wait()
以确保它完成执行:
EntryPoint.Run(sim, 1).Wait();
如果您这样做,您会注意到 Run
期间失败,而不是 Console.WriteLine
。
我正在玩 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# 中执行此操作的方法。有趣的是,我删除了控制台行,程序将 运行 没有错误(计时?)。
您用来创建量子位的 QubitManager
实例不是单例(每个 Simulator
都有自己的 QubitManager
),因此 Simulator
不知道Qubit
你试图操纵 Q# 代码,因此 AccessViolationException
.
一般情况下,不支持在驱动上创建量子比特;您可以在 Q# 中使用 only allocate qubits using the allocate
and borrowing
语句。建议在 Q# 中创建一个入口点来分配执行量子比特分配的量子比特,并从驱动程序中调用它,例如:
// MyOp.qs
operation EntryPoint() : ()
{
body
{
using (register = Qubit[2])
{
myOp(register);
}
}
}
// Driver.cs
EntryPoint.Run().Wait();
最后,请注意在您的驱动程序代码中您有:
Solve.Run(sim, q1, 1);
Run
方法returns一个异步执行的任务。您通常必须添加一个 Wait()
以确保它完成执行:
EntryPoint.Run(sim, 1).Wait();
如果您这样做,您会注意到 Run
期间失败,而不是 Console.WriteLine
。