Source code for qiskit.aqua.components.oracles.custom_circuit_oracle

# -*- coding: utf-8 -*-

# This code is part of Qiskit.
#
# (C) Copyright IBM 2019, 2020
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""
The Custom Circuit-based Quantum Oracle.
"""

from typing import Optional, Callable, List, Tuple
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.aqua import AquaError
from .oracle import Oracle


[docs]class CustomCircuitOracle(Oracle): """ The Custom Circuit-based Quantum Oracle. A helper class to, in essence, 'wrap' a user-supplied quantum circuit such that it becomes of type :class:`Oracle` and hence can be used by algorithms taking an oracle as input. This class is provided for easy creation of oracles using custom circuits. It is geared towards programmatically experimenting with oracles, where a user directly provides a `QuantumCircuit` object, corresponding to the intended oracle function, together with the various `QuantumRegister` objects involved. """ def __init__(self, variable_register: Optional[QuantumRegister] = None, output_register: Optional[QuantumRegister] = None, ancillary_register: Optional[QuantumRegister] = None, circuit: Optional[QuantumCircuit] = None, evaluate_classically_callback: Optional[Callable[[str], Tuple[bool, List[int]]]] = None): """ Args: variable_register: The register holding variable qubit(s) for the oracle function output_register: The register holding output qubit(s) for the oracle function ancillary_register: The register holding ancillary qubit(s) circuit: The quantum circuit corresponding to the intended oracle function evaluate_classically_callback: The classical callback function for evaluating the oracle, for example, to use with :class:`~qiskit.aqua.algorithms.Grover`'s search Raises: AquaError: Invalid input """ super().__init__() if variable_register is None: raise AquaError('Missing QuantumRegister for variables.') if output_register is None: raise AquaError('Missing QuantumRegister for output.') if circuit is None: raise AquaError('Missing custom QuantumCircuit for the oracle.') self._variable_register = variable_register self._output_register = output_register self._ancillary_register = ancillary_register self._circuit = circuit if evaluate_classically_callback is not None: self.evaluate_classically = evaluate_classically_callback @property def variable_register(self): return self._variable_register @property def output_register(self): return self._output_register @property def ancillary_register(self): return self._ancillary_register @property def circuit(self): return self._circuit
[docs] def construct_circuit(self): """Construct the oracle circuit. Returns: QuantumCircuit: A quantum circuit for the oracle. """ return self._circuit