Qiskit / qiskit

Qiskit is an open-source SDK for working with quantum computers at the level of extended quantum circuits, operators, and primitives.
https://www.ibm.com/quantum/qiskit
Apache License 2.0
5.02k stars 2.32k forks source link

TypeError: ParameterExpression with unbound parameters ({Parameter(w_112)}) cannot be cast to a float. #11816

Open dhamotharnaf opened 6 months ago

dhamotharnaf commented 6 months ago

Environment

What is happening?

I have a variational circuit, and I'm also employing the MCMT method to construct a generalized circuit. My circuit is dependent on an input Hermitian matrix. However, when I attempt to work with a larger-sized matrix, I encounter a significant increase in the number of variational parameters. Consequently, I face an issue where the parameters cannot be cast to a float. Strangely, this problem is not present for smaller parameter sets. I suspect that the problem might be related to the complex numbers I am using. I've been attempting to resolve this issue for a while. I'll attach a screenshot of the error for reference.

Screenshot 2024-02-15 225735

How can we reproduce the issue?


    def make_Ai(self, key, control_list):
        ''' Applies gates coherently using multi-controlled gates
            Args : key --> Gate name
            control_list --> index of ancilla qubits to be used as control'''
        Ai = QuantumCircuit(self.tot_qubits)
        key = key[::-1]
        for _ in range(len(key)):
            if key[_] == 'I':
                continue
            '''
            MCMT is multi controlled multi target gate. Here we define MCX, MCY, MCZ from base X,Y Z gates
            '''
            if key[_] == 'X':
                MCX = MCMT(Ai.x, len(control_list), 1)
                apply_bits = control_list + [self.ancilla_size + _]
                Ai.append(MCX, apply_bits)

            if key[_] == 'Z':
                MCZ = MCMT(Ai.z, len(control_list), 1)
                apply_bits = control_list + [self.ancilla_size + _]
                Ai.append(MCZ, apply_bits)

            if key[_] == 'Y':
                MCY = MCMT(Ai.y, len(control_list), 1)
                apply_bits = control_list + [self.ancilla_size + _]
                Ai.append(MCY, apply_bits)
        return Ai.decompose()
    def var_circuit(self, parameters):
        '''
        Creates a variational quantum circuit.
        This is analogous to CA function but here we apply multi controlled ry gates coherently

        Args : parameters --> variable names for rotation gates

        '''
        vc = QuantumCircuit(self.tot_qubits, name='var_circuit')
        for idx in range(1, len(self.keys) + 1):
            control_bin = self.convert_bin(idx, self.ancilla_size)
            control_bits = []
            for j in range(len(control_bin)):
                if control_bin[j] == '1':
                    control_bits.append(j)
            for n_idx in range(self.n_qubits):
                q = QuantumCircuit(1, name='cry')
                q.ry(parameters[idx - 1][n_idx], 0)
                working_bits = control_bits + [n_idx + self.ancilla_size]
                mcry = MCMT(q.to_gate(), len(control_bits), 1)
                vc.append(mcry, working_bits)
        return vc.decompose()

def full_circuit(self, parameters):
        '''
        Putting all quantum sub circuits into one full circuit.
        This is used for evaluating cost funtions
        '''
        FC = QuantumCircuit(self.tot_qubits)
        tot_qubits_list = [_ for _ in range(self.tot_qubits)]
        ancilla_list = [_ for _ in range(self.ancilla_size)]

        FC.append(self.UC(), ancilla_list)
        FC.barrier()

        FC.append(self.var_circuit(parameters), tot_qubits_list)
        FC.barrier()

        FC.append(self.CA(self.keys), tot_qubits_list)
        FC.barrier()

        FC.append(self.UCD(), ancilla_list)

        return FC

    def global_ground(self, weights):
        '''
        Cost function circuit. 
        '''
        num_parameters = len(self.keys) * self.n_qubits
        parameters = []
        for i in range(num_parameters):
            parameters.append(Parameter('w_' + str(i)))

        value_dict = {}
        for i in range(len(parameters)):
            value_dict[parameters[i]] = float(weights[i])
        print(value_dict)
        parameters = np.array(parameters).reshape(
            len(self.keys), self.n_qubits)
        circuit = QuantumCircuit(self.tot_qubits, self.n_qubits)
        circuit.append(self.full_circuit(parameters), [
                       _ for _ in range(self.tot_qubits)])
        circuit = circuit.bind_parameters(value_dict)
        circuit.measure([self.ancilla_size + _ for _ in range(self.n_qubits)],
                        [_ for _ in range(self.n_qubits)]) 
n_qubits = 10 
# assume that i got 500 as my matrice's coefficients so that i have 500 X 10 of parameters 
weights = 500 * (n_qubits)                  
global_ground(weights) ```       

### What should happen?

It shouldn't throw this error instead it should continue to perform normally like it did for smaller matrices 

### Any suggestions?

Could be an issue of complex number trying to be converted into a float. 
jakelishman commented 6 months ago

Please could you:

If those still don't help, please can you provide any error message in text - screenshots are very hard to read and can't be searched.

dhamotharnaf commented 6 months ago

@jakelishman, thank you for your suggestions, and I apologize for the delay. After following your advice, I experimented with two different approaches while creating virtual environments. I am utilizing a GPU EC2 Machine, so instead of qiskit-aer, I am using qiskit-aer-gpu.

Approach 1 (Virtual Environment 1)

Approach 2 (Virtual Environment 2)

Note: I cannot use qiskit 1.0.0 due to a conflict between qiskit-terra and qiskit>=1.0.

I hope this clarifies the steps I took, and I appreciate your ongoing support in resolving this issue.

Error Message


Traceback (most recent call last):
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/QTestMain.py", line 76, in <module>
    qx  = solver.Solve()
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/QTest.py", line 376, in Solve
    w = opt.minimize(fun=self.cost_fn,x0=weights,jac=num_parameters,bounds=[(0, 2 * np.pi) for i in range(num_parameters)])
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/algorithms/optimizers/scipy_optimizer.py", line 154, in minimize
    raw_result = minimize(
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_minimize.py", line 719, in minimize
    res = _minimize_cobyla(fun, x0, args, constraints, callback=callback,
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_cobyla_py.py", line 35, in wrapper
    return func(*args, **kwargs)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_cobyla_py.py", line 278, in _minimize_cobyla
    sf = _prepare_scalar_function(fun, x0, args=args, jac=_jac)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_optimize.py", line 402, in _prepare_scalar_function
    sf = ScalarFunction(fun, x0, args, grad, hess,
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py", line 166, in __init__
    self._update_fun()
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py", line 262, in _update_fun
    self._update_fun_impl()
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py", line 163, in update_fun
    self.f = fun_wrapped(self.x)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/scipy/optimize/_differentiable_functions.py", line 145, in fun_wrapped
    fx = fun(np.copy(x), *args)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/QTest.py", line 260, in cost_fn
    p_gg = self.global_ground(weights)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/QTest.py", line 218, in global_ground
    circuit.append(self.full_circuit(parameters), [
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/QTest.py", line 172, in full_circuit
    FC.append(self.var_circuit(parameters), tot_qubits_list)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/QTest.py", line 156, in var_circuit
    mcry = MCMT(q.to_gate(), len(control_bits), 1)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/library/generalized_gates/mcmt.py", line 85, in __init__
    self._build()
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/library/generalized_gates/mcmt.py", line 98, in _build
    mcmt_gate = broadcasted_gate.control(self.num_ctrl_qubits)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/gate.py", line 129, in control
    return add_control(self, num_ctrl_qubits, label, ctrl_state)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/add_control.py", line 61, in add_control
    cgate = control(operation, num_ctrl_qubits=num_ctrl_qubits, label=label, ctrl_state=ctrl_state)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/add_control.py", line 143, in control
    controlled_circ.mcry(
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py", line 331, in mcry
    RYGate(theta).to_matrix(),
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/gate.py", line 61, in to_matrix
    return self.__array__(dtype=complex)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/library/standard_gates/ry.py", line 106, in __array__
    cos = math.cos(self.params[0] / 2)
  File "/home/aakif.akhtar/CVQLS/CVQLS_Qiskit/qiskit_gpu_v3/lib/python3.10/site-packages/qiskit/circuit/parameterexpression.py", line 493, in __float__
    raise TypeError(
TypeError: ParameterExpression with unbound parameters (dict_keys([Parameter(w_112)])) cannot be cast to a float.