Closed CandyPanda-LS closed 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?
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.
Thank you @jakelishman
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)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