TypeError: (): 函数参数不兼容。 AerConfig,arg0:列表[列表[元组[元组[int,int],列表[浮点]]]])->无

问题描述 投票:0回答:1

我有一个函数运行,它使用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]]]

有什么想法吗?

python-3.x qiskit
1个回答
0
投票

首先要解决参数定义行的不兼容问题进行转换,现在即使数据类型已经是字符串作为键,数字作为值,但数据类型应该强调清楚:

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])
© www.soinside.com 2019 - 2024. All rights reserved.