我有一个函数运行,它使用parameter_binds
def run(self, i):
params = i
backend = Aer.get_backend('qasm_simulator')
param_binds = [{self.thetas[k] : params[k].item() for k in range(NUM_QUBITS)}]
print(param_binds)
job_sim = backend.run(self.circuit,
shots=self.shots,
parameter_binds = param_binds)#[{self.thetas[k] : params[k].item() for k in range(2*NUM_QUBITS)}])
result_sim = job_sim.result()
counts = result_sim.get_counts(self.circuit)
return self.N_qubit_expectation_Z(counts,self.shots,NUM_QUBITS)
然后将用于以下
circuit = QiskitCircuit(NUM_QUBITS, SIMULATOR, NUM_SHOTS)
print('Expected value for rotation [pi/4]: {}'.format(circuit.run(torch.Tensor([np.pi/4]*NUM_QUBITS))))
但是我有这个错误,无论我对参数列表做了什么更改,它都会再次出现或声称该列表是不可散列的
TypeError: (): incompatible function arguments. The following argument types are supported:
1. (self: qiskit_aer.backends.controller_wrappers.AerConfig, arg0: list[list[tuple[tuple[int, int], list[float]]]]) -> None
Invoked with: <qiskit_aer.backends.controller_wrappers.AerConfig object at 0x000002222C60EC30>, [[[(4, 0), 0.7853981852531433], [(5, 0), 0.7853981852531433], [(6, 0), 0.7853981852531433], [(7, 0), 0.7853981852531433], [(11, 0), 0.7853981852531433], [(12, 0), 0.7853981852531433], [(13, 0), 0.7853981852531433], [(14, 0), 0.7853981852531433]]]
有什么想法吗?
首先要解决参数定义行的不兼容问题进行转换,现在即使数据类型已经是字符串作为键,数字作为值,但数据类型应该强调清楚:
pb = [{str(self.thetas[k]) : float(params[k].item()) for k in range(NUM_QUBITS)}]
但是,这还不是全部,因为 aerbackend.py 文件中存在一个错误,它不断导致问题,因为读取的值总是返回 null,因此append_param_values 方法应该更新如下:
def append_param_values(index, bind_pos, param):
if param in binds:
parameterizations.append([(index, bind_pos), binds[param]])
elif isinstance(param, ParameterExpression):
# If parameter expression has no unbound parameters
# it's already bound and should be skipped
if not param.parameters:
return
if not binds:
raise AerError("The element of parameter_binds is empty.")
len_vals = len(binds.values())
bind_list = []
for i in range(len_vals):
bind_dict = {}
for parameter in binds.keys():
for params in param.parameters :
if str(parameter)==str(params):
if isinstance(binds[parameter], float):
bind_dict[params] = binds[parameter]
break
bind_list.append(bind_dict)
bound_values = [float(param.bind(x)) for x in bind_list]
parameterizations.append([(index, bind_pos), bound_values])