回调函数使用
回调函数允许用户在电路执行过程中对状态向量应用额外的函数。一个典型的应用场景是在状态通过电路传播时计算纠缠熵。这可以通过qibo.callbacks.EntanglementEntropy和qibo.gates.CallbackGate门轻松实现。例如:
In [2]:
Copied!
from qibo import gates, callbacks
from qibo import models, Circuit
# 创建一个熵回调函数,其中 qubit 0 是第一个子系统
entropy = callbacks.EntanglementEntropy([0])
# 初始化一个包含 2 个量子比特的电路,并添加门
circuit = Circuit(2) # 初始状态为 |00> (熵 = 0)
circuit.add(gates.CallbackGate(entropy)) # 在初始状态下执行熵计算
circuit.add(gates.H(0)) # 状态变为 |+0> (熵 = 0)
circuit.add(gates.CallbackGate(entropy)) # 在应用 H 门后执行熵计算
circuit.add(gates.CNOT(0, 1)) # 状态变为 |00> + |11> (熵 = 1)
circuit.add(gates.CallbackGate(entropy)) # 在应用 CNOT 门后执行熵计算
# 执行电路并使用回调函数
final_state = circuit()
from qibo import gates, callbacks
from qibo import models, Circuit
# 创建一个熵回调函数,其中 qubit 0 是第一个子系统
entropy = callbacks.EntanglementEntropy([0])
# 初始化一个包含 2 个量子比特的电路,并添加门
circuit = Circuit(2) # 初始状态为 |00> (熵 = 0)
circuit.add(gates.CallbackGate(entropy)) # 在初始状态下执行熵计算
circuit.add(gates.H(0)) # 状态变为 |+0> (熵 = 0)
circuit.add(gates.CallbackGate(entropy)) # 在应用 H 门后执行熵计算
circuit.add(gates.CNOT(0, 1)) # 状态变为 |00> + |11> (熵 = 1)
circuit.add(gates.CallbackGate(entropy)) # 在应用 CNOT 门后执行熵计算
# 执行电路并使用回调函数
final_state = circuit()
[Qibo 0.2.21|INFO|2025-10-11 16:23:03]: Using qibojit (numba) backend on /CPU:0 e:\qiboenv\qibovenv\Lib\site-packages\scipy\linalg\_matfuncs.py:218: LogmExactlySingularWarning: The logm input matrix is exactly singular. F = scipy.linalg._matfuncs_inv_ssq._logm(A) e:\qiboenv\qibovenv\Lib\site-packages\qibo\quantum_info\entropies.py:540: RuntimeWarning: divide by zero encountered in log2 backend.np.log2(eigenvalues) / np.log2(base),
In [7]:
Copied!
# execute the circuit
final_state = circuit()
# execute the circuit
final_state = circuit()
In [13]:
Copied!
print(entropy[0:3]) # [0, 0, 1, 0, 0, 1]
print(entropy[0:3]) # [0, 0, 1, 0, 0, 1]
[0.0, np.float64(3.203426503814917e-16), np.float64(1.0)]
In [15]:
Copied!
# 添加到电路
circuit = Circuit(2)
circuit.add(gates.CallbackGate(entropy))
circuit.add(gates.H(0))
circuit.add(gates.CNOT(0, 1))
# 执行电路
result = circuit()
# 添加到电路
circuit = Circuit(2)
circuit.add(gates.CallbackGate(entropy))
circuit.add(gates.H(0))
circuit.add(gates.CNOT(0, 1))
# 执行电路
result = circuit()
In [17]:
Copied!
type(entropy) # <class 'qibo.callbacks.EntanglementEntropy'>
type(entropy) #
Out[17]:
qibo.callbacks.EntanglementEntropy
In [19]:
Copied!
entropy[0:3] # [0, 0, 1, 0, 0, 1]
entropy[0:3] # [0, 0, 1, 0, 0, 1]
Out[19]:
[0.0, np.float64(3.203426503814917e-16), np.float64(1.0)]
In [ ]:
Copied!
# 使用 pprint 模块的 pprint 函数打印 entropy 对象的所有属性和值
pprint.pprint(vars(entropy))
# 使用 pprint 模块的 pprint 函数打印 entropy 对象的所有属性和值
pprint.pprint(vars(entropy))
{'_nqubits': 2,
'_results': [0.0,
np.float64(3.203426503814917e-16),
np.float64(1.0),
0.0,
np.float64(8.526512829121201e-14),
np.float64(1.0),
0.0,
np.float64(3.203426503814917e-16),
np.float64(1.0),
0.0,
np.float64(8.526512829121201e-14),
np.float64(1.0),
0.0,
0.0],
'base': 2,
'compute_spectrum': False,
'partition': [0],
'spectrum': []}
In [20]:
Copied!
print(entropy.__dict__)
print(entropy.__dict__)
{'_results': [0.0, np.float64(3.203426503814917e-16), np.float64(1.0), 0.0, np.float64(8.526512829121201e-14), np.float64(1.0), 0.0, np.float64(3.203426503814917e-16), np.float64(1.0), 0.0, np.float64(8.526512829121201e-14), np.float64(1.0), 0.0, 0.0], '_nqubits': 2, 'partition': [0], 'compute_spectrum': False, 'base': 2, 'spectrum': []}
In [ ]:
Copied!
# 如果你想以更友好的方式查看
# 导入 pprint 模块,用于格式化输出
import pprint
# 使用 pprint.pprint() 方法打印 entropy 对象的 __dict__ 属性,显示其所有属性和方法
pprint.pprint(entropy.__dict__)
# 如果你想以更友好的方式查看
# 导入 pprint 模块,用于格式化输出
import pprint
# 使用 pprint.pprint() 方法打印 entropy 对象的 __dict__ 属性,显示其所有属性和方法
pprint.pprint(entropy.__dict__)
{'_nqubits': 2,
'_results': [0.0,
np.float64(3.203426503814917e-16),
np.float64(1.0),
0.0,
np.float64(8.526512829121201e-14),
np.float64(1.0),
0.0,
np.float64(3.203426503814917e-16),
np.float64(1.0),
0.0,
np.float64(8.526512829121201e-14),
np.float64(1.0),
0.0,
0.0],
'base': 2,
'compute_spectrum': False,
'partition': [0],
'spectrum': []}
In [ ]:
Copied!