4. 量子运算符
4.1. cudaq::spin_op
[1] CUDA-Q 在 cudaq 命名空间中提供了一种原生 spin_op 数据类型,用于表达量子力学自旋运算符。
[2] spin_op 为泡利自旋运算符的一般张量积及其和提供了一种抽象表示:

其中 i 表示量子比特索引,n 表示量子比特数量,P ∈ {I, X, Y, Z}。
[3] spin_op 暴露了常见的 C++ 运算符重载,以支持代数表达式。
[4] CUDA-Q 定义了静态函数来创建指定量子比特索引上的原始 X、Y、Z 泡利运算符,这些运算符随后可在代数表达式中用于构建更复杂的泡利张量积及其和。
C++ 示例:
auto h = 5.907 - 2.1433 * cudaq::spin_op::x(0) * cudaq::spin_op::x(1) - \
2.1433 * cudaq::spin_op::y(0) * cudaq::spin_op::y(1) + \
.21829 * cudaq::spin_op::z(0) - 6.125 * cudaq::spin_op::z(1);
Python 示例
from cudaq import spin
h = 5.907 - 2.1433 * spin.x(0) * spin.x(1) - 2.1433 * spin.y(0) * spin.y(1) + \
.21829 * spin.z(0) - 6.125 * spin.z(1)
[5] spin_op 还提供了一种在量子内核代码中表达电路合成任务的机制。具体来说,它支持编码指数化 spin_op 旋转的第 n 阶 Trotterization 操作,例如 exp(i * theta * H),其中 H 是提供的 spin_op。目前,H 被限制为单一乘积项。
[6] spin_op 可以在经典主机代码和量子内核代码中创建,也可以通过值从主机代码传递给量子内核代码。
5. 量子内禀操作
[1] 为了支持底层量子编程并为大规模应用构建基础量子内核,CUDA-Q 针对设备特定的单量子比特酉操作定义了量子内禀操作抽象。
[2] 量子内禀操作通过原生经典语言中的标准自由函数建模。它具有唯一的指令名称和通用的指定函数操作数。
[3] 这些操作数可以建模经典旋转参数或量子信息单元(例如 cudaq::qudit)。这些操作的语法如下:
void INST_NAME( PARAM...?, cudaq::qudit<N>&...);
其中 INST_NAME 是指令名称,qudit<N>&... 表示一个或多个 cudaq::qudit 实例,PARAM...? 表示可选浮点类型参数(例如 double、float)。量子内禀操作返回 void。
[4] 所有内禀操作应以针对单个 cudaq::qudit 的基础声明开始,并提供接受多个 cudaq::qudit 实例的重载,以建模该指令在所有提供的 cudaq::qudit 上的应用,例如 void x(cudaq::qubit&) 和 x(cudaq::qubit&, cudaq::qubit&, cudaq::qubit&),分别建模对单个或多个 cudaq::qubit 的 NOT 操作。
[5] 程序员可用的特定量子内禀操作集合可能因平台而异,并通过平台特定的头文件提供。
[6] 实现应提供重载以支持单量子比特内禀操作在 cudaq::qudit 容器上的广播。例如,x(cudaq::qvector<>&) 应在提供的 cudaq::qvector 中的所有 cudaq::qubit 上应用 NOT 操作。
[7] 程序员可以通过额外的指定模板参数进一步修改量子内禀操作,CUDA-Q 利用此语法来合成操作的控制版本和伴随版本。具体来说,CUDA-Q 提供了 cudaq::ctrl 和 cudaq::adj 类型修饰符,用于合成操作的控制形式和伴随形式。对于不支持模板参数化的语言绑定,实现可能依赖于静态方法调用(例如 x.ctrl(q, r))。
以下是如何为多控制和伴随操作修改内禀操作的示例:
C++ 示例:
cudaq::qubit q, r, s;
// 应用 T 操作
t(q);
// 应用 Tdg 操作
t<cudaq::adj>(q);
// 应用控制 Hadamard 操作
h<cudaq::ctrl>(q,r,s);
// 错误,ctrl 要求 > 1 个量子比特操作数
// h<cudaq::ctrl>(r);
Python 示例
q, r, s = cudaq.qubit(), cudaq.qubit(), cudaq.qubit()
# Apply T operation
t(q)
# Apply Tdg operation
t.adj(q)
# Apply control Hadamard operation
h.ctrl(q,r,s)
# Error, ctrl requires > 1 qubit operands
# h.ctrl(r);
5.1. cudaq::qubit 上的操作
针对 cudaq::qubit 类型的默认量子内禀操作集合如下:
namespace cudaq {
struct base;
struct ctrl;
struct adj;
// 单量子比特操作、ctrl/adj 变体及广播
template<typename mod = base, typename... QubitArgs>
void NAME(QubitArgs&... args) noexcept { ... }
template<typename mod = base>
void NAME(const qvector& qr) noexcept { ... }
template<typename mod = ctrl>
void NAME(qvector& ctrls, qubit& target) noexcept { ... }
// 单量子比特旋转操作及 ctrl/adj 变体
template <typename mod = base, typename ScalarAngle, typename... QubitArgs>
void ROTATION_NAME(ScalarAngle angle, QubitArgs &...args) noexcept { ... }
bool MEASURE_OP(qubit &q) noexcept;
std::vector<bool> MEASURE_OP(qvector &q) noexcept;
double measure(const cudaq::spin_op & term) noexcept { ... }
}
[1] 对于 cudaq::qubit 内禀操作的默认实现,我们让 NAME 是集合 {h, x, y, z, t, s} 中的任意操作名称,ROTATION_NAME 是集合 {rx, ry, rz, r1 (phase)} 中的任意操作。实现可以使用上述基础函数提供适当的函数实现,以支持其他常见操作(例如 cnot -> x<cudaq::ctrl>)。
[2] 控制量子比特可以指定为正极性或负极性。这意味着控制量子比特可以指定当控制量子比特状态为 |0>(正极性)或 |1>(负极性)时应用目标操作。默认情况下,所有控制量子比特都被假定为正极性。取反极性的语法是在控制量子比特前使用非运算符:
C++ 示例:
x<cudaq::ctrl>(!q, r);
Python 示例 :
x.ctrl(~q, r)
官方 CUDA-Q 实现支持的量子门集合可以在 API 文档中找到。

180

被折叠的 条评论
为什么被折叠?



