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.07k stars 2.33k forks source link

AttributeError: '_DiagonalEstimator' object has no attribute '_circuits' #11818

Closed CandyPanda-LS closed 7 months ago

CandyPanda-LS commented 7 months ago

Environment

What is happening?

I tried to solve the portfolio optimization by defining a custom problem apart from the already available problem. Given below is the equation I want to minimize in the unconstrained form. But when I formulate this as a QP and provide to the optimizer I am getting and error AttributeError: '_DiagonalEstimator' object has no attribute '_circuits' (please find the stack trace attached underneath) Screenshot 2024-02-16 at 04 36 46

Screenshot 2024-02-16 at 04 40 40

How can we reproduce the issue?

from typing import List, Tuple, Union, Optional

import numpy as np

from docplex.mp.advmodel import AdvModel

from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.applications import OptimizationApplication from qiskit_optimization.problems import QuadraticProgram from qiskit_optimization.translators import from_docplex_mp from qiskit_finance.exceptions import QiskitFinanceError

mdl = AdvModel(name="Portfolio optimization")

N = 10
M = 5

lambda_risk = 0.5 lambda_linking = 0.1 lambda_budget = 0.2 lambda_diversification = 0.15 lambda_cardinality = 0.05

R = 100 # Example: Risk tolerance parameter B = 50 # Example: Total budget D = 10 # Example: Diversification requirement K = 3 # Example: Cardinality constraint (e.g., number of assets to select)

mu = np.random.uniform(low=0.1, high=1.0, size=N) sigma = np.random.uniform(low=0.01, high=0.1, size=(N, N)) c = np.random.uniform(low=1, high=10, size=N)

z = {(i, l): mdl.binaryvar(name=f"z{i}_{l}") for i in range(N) for l in range(M)} y = [mdl.binaryvar(name=f"y{i}") for i in range(N)]

risk_term = mdl.sum(lambda_risk * ((2(l+p) * sigma[i][j])*2 - R 2(l+p+1) sigma[i][j]) z[i, l] * z[j, p] for i in range(N) for j in range(N) for l in range(M) for p in range(M))

linking_term = mdl.sum(-lambda_linking * (2*(l+1) D) z[i, l] y[i] for i in range(N) for l in range(M))

other_terms = mdl.sum((lambda_budget * (2(2l) c[i]2 - 2(l+1) c[i] B) + lambda_diversification * (2*(2l) - 2(l+1) D) + lambda_linking 2(2l) - mu[i] 2l) * z[i, l] for i in range(N) for l in range(M))

cardinality_term = mdl.sum((lambda_cardinality (1 - 2 K) + lambda_linking * D*2) y[i] for i in range(N))

constant_terms = lambda_risk * R2 + lambda_budget * B*2 + lambda_diversification D2 + lambda_cardinality * K**2

mdl.minimize(risk_term + linking_term + other_terms + cardinality_term + constant_terms)

from qiskit_algorithms import NumPyMinimumEigensolver, QAOA, SamplingVQE from qiskit_optimization.algorithms import MinimumEigenOptimizer from qiskit_algorithms.optimizers import COBYLA from qiskit_aer.primitives import Sampler

qp = from_docplex_mp(mdl) cobyla = COBYLA() cobyla.set_options(maxiter=250) qaoa_mes = QAOA(sampler=Sampler(), optimizer=cobyla, reps=3) qaoa = MinimumEigenOptimizer(qaoa_mes) result = qaoa.solve(qp)

What should happen?

The modeled optimization problem should be solved.

Any suggestions?

No response

jakelishman commented 7 months ago

This issue is arising from qiskit_algorithms, rather than Qiskit itself. Please can you re-file this issue against https://github.com/qiskit-community/qiskit-algorithms?

jakelishman commented 7 months ago

Fwiw, this appears to have been fixed by qiskit-community/qiskit-algorithms#98, so it's possible it's just waiting for a new release of that project before it's ready for Qiskit 1.0.

CandyPanda-LS commented 7 months ago

Thank you @jakelishman