15
15
"""GroverOptimizer module"""
16
16
17
17
import logging
18
- from typing import Optional , Dict , Union , List
19
18
import math
20
19
from copy import deepcopy
20
+ from typing import Optional , Dict , Union , List
21
21
22
22
import numpy as np
23
+
23
24
from qiskit import QuantumCircuit , QuantumRegister
24
- from qiskit .circuit .library import QuadraticForm
25
- from qiskit .providers import BaseBackend
26
25
from qiskit .aqua import QuantumInstance , aqua_globals
27
26
from qiskit .aqua .algorithms .amplitude_amplifiers .grover import Grover
28
27
from qiskit .aqua .components .initial_states import Custom
29
28
from qiskit .aqua .components .oracles import CustomCircuitOracle
29
+ from qiskit .circuit .library import QuadraticForm
30
+ from qiskit .providers import BaseBackend
30
31
from .optimization_algorithm import OptimizationAlgorithm , OptimizationResult
32
+ from ..converters .quadratic_program_to_qubo import QuadraticProgramToQubo
31
33
from ..problems import Variable
32
34
from ..problems .quadratic_program import QuadraticProgram
33
- from ..converters .quadratic_program_to_qubo import QuadraticProgramToQubo
34
-
35
35
36
36
logger = logging .getLogger (__name__ )
37
37
@@ -153,7 +153,7 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult:
153
153
154
154
# convert problem to QUBO
155
155
problem_ = self ._qubo_converter .convert (problem )
156
- problem0 = deepcopy (problem_ )
156
+ problem_init = deepcopy (problem_ )
157
157
158
158
# convert to minimization problem
159
159
sense = problem_ .objective .sense
@@ -262,15 +262,16 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult:
262
262
opt_x = np .array ([1 if s == '1' else 0 for s in ('{0:%sb}' % n_key ).format (optimum_key )])
263
263
264
264
# Compute function value
265
- fval = problem0 .objective .evaluate (opt_x )
265
+ fval = problem_init .objective .evaluate (opt_x )
266
266
result = OptimizationResult (x = opt_x , fval = fval , variables = problem_ .variables )
267
267
268
268
# cast binaries back to integers
269
269
result = self ._qubo_converter .interpret (result )
270
270
271
271
return GroverOptimizationResult (x = result .x , fval = result .fval , variables = result .variables ,
272
272
operation_counts = operation_count , n_input_qubits = n_key ,
273
- n_output_qubits = n_value )
273
+ n_output_qubits = n_value , intermediate_fval = fval ,
274
+ threshold = threshold )
274
275
275
276
def _measure (self , circuit : QuantumCircuit ) -> str :
276
277
"""Get probabilities from the given backend, and picks a random outcome."""
@@ -334,7 +335,7 @@ class GroverOptimizationResult(OptimizationResult):
334
335
335
336
def __init__ (self , x : Union [List [float ], np .ndarray ], fval : float , variables : List [Variable ],
336
337
operation_counts : Dict [int , Dict [str , int ]], n_input_qubits : int ,
337
- n_output_qubits : int ) -> None :
338
+ n_output_qubits : int , intermediate_fval : float , threshold : float ) -> None :
338
339
"""
339
340
Constructs a result object with the specific Grover properties.
340
341
@@ -345,11 +346,16 @@ def __init__(self, x: Union[List[float], np.ndarray], fval: float, variables: Li
345
346
operation_counts: The counts of each operation performed per iteration.
346
347
n_input_qubits: The number of qubits used to represent the input.
347
348
n_output_qubits: The number of qubits used to represent the output.
349
+ intermediate_fval: The intermediate value of the objective function of the solution,
350
+ that is expected to be identical with ``fval``.
351
+ threshold: The threshold of Grover algorithm.
348
352
"""
349
- super ().__init__ (x , fval , variables , None )
353
+ raw_results = {'intermediate_fval' : fval , 'threshold' : threshold }
354
+ super ().__init__ (x , fval , variables , raw_results )
350
355
self ._operation_counts = operation_counts
351
356
self ._n_input_qubits = n_input_qubits
352
357
self ._n_output_qubits = n_output_qubits
358
+ self ._intermediate_fval = intermediate_fval
353
359
354
360
@property
355
361
def operation_counts (self ) -> Dict [int , Dict [str , int ]]:
0 commit comments