Skip to content
This repository was archived by the owner on Dec 7, 2021. It is now read-only.

Commit 0f0f0e3

Browse files
committed
add intermediate_fval and threshold to raw_results
1 parent 24b8469 commit 0f0f0e3

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

qiskit/optimization/algorithms/grover_optimizer.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,23 @@
1515
"""GroverOptimizer module"""
1616

1717
import logging
18-
from typing import Optional, Dict, Union, List
1918
import math
2019
from copy import deepcopy
20+
from typing import Optional, Dict, Union, List
2121

2222
import numpy as np
23+
2324
from qiskit import QuantumCircuit, QuantumRegister
24-
from qiskit.circuit.library import QuadraticForm
25-
from qiskit.providers import BaseBackend
2625
from qiskit.aqua import QuantumInstance, aqua_globals
2726
from qiskit.aqua.algorithms.amplitude_amplifiers.grover import Grover
2827
from qiskit.aqua.components.initial_states import Custom
2928
from qiskit.aqua.components.oracles import CustomCircuitOracle
29+
from qiskit.circuit.library import QuadraticForm
30+
from qiskit.providers import BaseBackend
3031
from .optimization_algorithm import OptimizationAlgorithm, OptimizationResult
32+
from ..converters.quadratic_program_to_qubo import QuadraticProgramToQubo
3133
from ..problems import Variable
3234
from ..problems.quadratic_program import QuadraticProgram
33-
from ..converters.quadratic_program_to_qubo import QuadraticProgramToQubo
34-
3535

3636
logger = logging.getLogger(__name__)
3737

@@ -153,7 +153,7 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult:
153153

154154
# convert problem to QUBO
155155
problem_ = self._qubo_converter.convert(problem)
156-
problem0 = deepcopy(problem_)
156+
problem_init = deepcopy(problem_)
157157

158158
# convert to minimization problem
159159
sense = problem_.objective.sense
@@ -262,15 +262,16 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult:
262262
opt_x = np.array([1 if s == '1' else 0 for s in ('{0:%sb}' % n_key).format(optimum_key)])
263263

264264
# Compute function value
265-
fval = problem0.objective.evaluate(opt_x)
265+
fval = problem_init.objective.evaluate(opt_x)
266266
result = OptimizationResult(x=opt_x, fval=fval, variables=problem_.variables)
267267

268268
# cast binaries back to integers
269269
result = self._qubo_converter.interpret(result)
270270

271271
return GroverOptimizationResult(x=result.x, fval=result.fval, variables=result.variables,
272272
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)
274275

275276
def _measure(self, circuit: QuantumCircuit) -> str:
276277
"""Get probabilities from the given backend, and picks a random outcome."""
@@ -334,7 +335,7 @@ class GroverOptimizationResult(OptimizationResult):
334335

335336
def __init__(self, x: Union[List[float], np.ndarray], fval: float, variables: List[Variable],
336337
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:
338339
"""
339340
Constructs a result object with the specific Grover properties.
340341
@@ -345,11 +346,16 @@ def __init__(self, x: Union[List[float], np.ndarray], fval: float, variables: Li
345346
operation_counts: The counts of each operation performed per iteration.
346347
n_input_qubits: The number of qubits used to represent the input.
347348
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.
348352
"""
349-
super().__init__(x, fval, variables, None)
353+
raw_results = {'intermediate_fval': fval, 'threshold': threshold}
354+
super().__init__(x, fval, variables, raw_results)
350355
self._operation_counts = operation_counts
351356
self._n_input_qubits = n_input_qubits
352357
self._n_output_qubits = n_output_qubits
358+
self._intermediate_fval = intermediate_fval
353359

354360
@property
355361
def operation_counts(self) -> Dict[int, Dict[str, int]]:

test/optimization/test_grover_optimizer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def validate_results(self, problem, results):
4343
# Validate results.
4444
np.testing.assert_array_almost_equal(comp_result.x, results.x)
4545
self.assertEqual(comp_result.fval, results.fval)
46+
self.assertAlmostEqual(results.fval, results.raw_results['intermediate_fval'])
4647

4748
def test_qubo_gas_int_zero(self):
4849
"""Test for when the answer is zero."""
@@ -60,6 +61,7 @@ def test_qubo_gas_int_zero(self):
6061
results = gmf.solve(op)
6162
np.testing.assert_array_almost_equal(results.x, [0, 0])
6263
self.assertEqual(results.fval, 0.0)
64+
self.assertAlmostEqual(results.fval, results.raw_results['intermediate_fval'])
6365

6466
def test_qubo_gas_int_simple(self):
6567
"""Test for simple case, with 2 linear coeffs and no quadratic coeffs or constants."""

0 commit comments

Comments
 (0)