参数化门使用
一些Qibo门(如旋转门)会为其自由参数接受值。一旦此类门被添加到电路中,就可以使用qibo.models.circuit.Circuit.set_parameters()方法来更新它们的参数。例如:
In [ ]:
Copied!
from qibo import Circuit, gates
# 创建一个包含3个量子比特的电路
circuit = Circuit(3)
# 在第一个量子比特上添加RX门,theta参数设为0
circuit.add(gates.RX(0, theta=0))
# 在第二个量子比特上添加RY门,theta参数设为0
circuit.add(gates.RY(1, theta=0))
# 在第二个和第三个量子比特上添加CZ门
circuit.add(gates.CZ(1, 2))
# 在第一个和第三个量子比特上添加fSim门,theta和phi参数设为0
circuit.add(gates.fSim(0, 2, theta=0, phi=0))
# 在第三个量子比特上添加Hadamard门
circuit.add(gates.H(2))
# 设置电路的参数为新的值
params = [0.123, 0.456, (0.789, 0.321)]
circuit.set_parameters(params)
from qibo import Circuit, gates
# 创建一个包含3个量子比特的电路
circuit = Circuit(3)
# 在第一个量子比特上添加RX门,theta参数设为0
circuit.add(gates.RX(0, theta=0))
# 在第二个量子比特上添加RY门,theta参数设为0
circuit.add(gates.RY(1, theta=0))
# 在第二个和第三个量子比特上添加CZ门
circuit.add(gates.CZ(1, 2))
# 在第一个和第三个量子比特上添加fSim门,theta和phi参数设为0
circuit.add(gates.fSim(0, 2, theta=0, phi=0))
# 在第三个量子比特上添加Hadamard门
circuit.add(gates.H(2))
# 设置电路的参数为新的值
params = [0.123, 0.456, (0.789, 0.321)]
circuit.set_parameters(params)
初始化一个电路,将所有门参数设置为0,然后根据params列表更新这些参数的值。或者,用户可以使用带有字典或扁平列表的circuit.set_parameters()。字典的键应该是电路门对象的引用。例如:
In [ ]:
Copied!
# 创建一个包含3个量子比特的电路
circuit = Circuit(3)
# 定义旋转门和fSim门,并初始化角度参数为0
g0 = gates.RX(0, theta=0) # RX门作用于第0个量子比特
g1 = gates.RY(1, theta=0) # RY门作用于第1个量子比特
g2 = gates.fSim(0, 2, theta=0, phi=0) # fSim门作用于第0和第2个量子比特
# 将门操作添加到电路中
circuit.add([g0, g1, gates.CZ(1, 2), g2, gates.H(2)])
# 使用字典设置电路参数的新值
params = {g0: 0.123, g1: 0.456, g2: (0.789, 0.321)}
circuit.set_parameters(params)
# 等价地,参数也可以通过列表更新
params = [0.123, 0.456, (0.789, 0.321)]
circuit.set_parameters(params)
# 或者使用一个平坦的列表来更新参数
params = [0.123, 0.456, 0.789, 0.321]
circuit.set_parameters(params)
# 创建一个包含3个量子比特的电路
circuit = Circuit(3)
# 定义旋转门和fSim门,并初始化角度参数为0
g0 = gates.RX(0, theta=0) # RX门作用于第0个量子比特
g1 = gates.RY(1, theta=0) # RY门作用于第1个量子比特
g2 = gates.fSim(0, 2, theta=0, phi=0) # fSim门作用于第0和第2个量子比特
# 将门操作添加到电路中
circuit.add([g0, g1, gates.CZ(1, 2), g2, gates.H(2)])
# 使用字典设置电路参数的新值
params = {g0: 0.123, g1: 0.456, g2: (0.789, 0.321)}
circuit.set_parameters(params)
# 等价地,参数也可以通过列表更新
params = [0.123, 0.456, (0.789, 0.321)]
circuit.set_parameters(params)
# 或者使用一个平坦的列表来更新参数
params = [0.123, 0.456, 0.789, 0.321]
circuit.set_parameters(params)
如果给出的是列表,那么它的长度和元素应与电路中包含的参数化门兼容。如果给出的是字典,那么它的键应该是电路中所有的参数化门。
以下门支持参数设置: RX、RY、RZ、U1、CU1:接受单个theta参数。 qibo.gates.fSim:接受两个参数组成的元组(theta, phi) qibo.gates.GeneralizedfSim:接受一个包含两个参数的元组(unitary, phi)。这里,unitary应为一个幺正矩阵,以数组或形状为(2, 2)的tf.Tensor形式给出。使用PyTorch后端时,需要一个torch.Tensor。 qibo.gates.Unitary
请注意,np.ndarray或tf.Tensor也可以用来替代扁平列表(使用pytorch后端时需要torch.Tensor)。使用qibo.models.circuit.Circuit.set_parameters()比重新创建一个具有新参数值的新电路更高效。逆方法qibo.models.circuit.Circuit.get_parameters()也可用,它会返回一个列表、字典或扁平列表,其中包含电路中所有参数化门的当前参数值。
In [3]:
Copied!
circuit = Circuit(3)
circuit.add(gates.RX(0, theta=0.123))
circuit.add(gates.RY(1, theta=0.456, trainable=False))
circuit.add(gates.fSim(0, 2, theta=0.789, phi=0.567))
print(circuit.get_parameters())
# prints [(0.123,), (0.789, 0.567)] ignoring the parameters of the RY gate
circuit = Circuit(3)
circuit.add(gates.RX(0, theta=0.123))
circuit.add(gates.RY(1, theta=0.456, trainable=False))
circuit.add(gates.fSim(0, 2, theta=0.789, phi=0.567))
print(circuit.get_parameters())
# prints [(0.123,), (0.789, 0.567)] ignoring the parameters of the RY gate
[(0.123,), (0.789, 0.567)]
In [ ]:
Copied!