cudaq spec 04,05,量子运算符

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...? 表示可选浮点类型参数(例如 doublefloat)。量子内禀操作返回 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 文档中找到。

「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 笔记本的散热风扇管理 ---------------------------------------- 09 November 2006. 对于版本20061109的变更概述如下: 1) ACPI CA核心子系统:在源操作数是一个操作区域的场景下,对负载ASL操作符进行了优化。仅需映射操作区域内存,而不是执行逐字节读取。 (区域必须为SystemMemory类型,见下文。)修正了源操作数为区域字段的负载ASL操作符问题。也允许缓冲区对象作为源操作数。 BZ 480 解决了负载ASL操作符允许源操作数为任意类型操作区域的问题。现被限制为仅SystemMemory类型的区域,符合ACPI规范。 BZ 481 对新表管理器代码进行了额外的清理和优化。AcpiEnable将在所有必需的ACPI表未加载时失败(FADT, FACS, DSDT)。 BZ 477 在acobject.h中添加了#pragma pack(8/4),以确保此头文件中的结构始终编译为对齐。ACPI_OPERAND_OBJECT已被手动优化为对齐,并在字节打包时无法工作。示例代码和数据大小:这些是Microsoft Visual C++ 6.0 32位编译器生成的、与操作系统无关的acpica.lib的大小。调试版本的代码包含调试输出跟踪机制,具有更大的代码和数据大小。上一个版本:非调试版本:78.1K代码,17.1K数据,95.2K总计 调试版本:155.4K代码,63.1K数据,218.5K总计 当前版本:非调试版本:77.9K代码,17.0K数据,94.9K总计 调试版本:155.2K代码,63.1K数据,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值