Source code for qiskit.aqua.components.variational_forms.variational_form

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

# This code is part of Qiskit.
#
# (C) Copyright IBM 2018, 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.
"""
This module contains the definition of a base class for
variational forms. Several types of commonly used ansatz.
"""

from typing import Optional, Union, List
# below to allow it for python 3.6.1
try:
    from typing import NoReturn
except ImportError:
    from typing import Any as NoReturn

from abc import ABC, abstractmethod
import numpy as np
from qiskit import QuantumRegister
from qiskit.aqua.utils import get_entangler_map, validate_entangler_map


[docs]class VariationalForm(ABC): """Base class for VariationalForms. This method should initialize the module and use an exception if a component of the module is not available. """ @abstractmethod def __init__(self) -> None: super().__init__() self._num_parameters = 0 self._num_qubits = 0 self._bounds = list() self._support_parameterized_circuit = False pass
[docs] @abstractmethod def construct_circuit(self, parameters: Union[List[float], np.ndarray], q: Optional[QuantumRegister] = None) -> NoReturn: """Construct the variational form, given its parameters. Args: parameters: circuit parameters. q: Quantum Register for the circuit. Returns: QuantumCircuit: A quantum circuit. """ raise NotImplementedError()
@property def num_parameters(self): """Number of parameters of the variational form. Returns: int: An integer indicating the number of parameters. """ return self._num_parameters @property def support_parameterized_circuit(self): """ Whether or not the sub-class support parameterized circuit. Returns: boolean: indicate the sub-class support parameterized circuit """ return self._support_parameterized_circuit @support_parameterized_circuit.setter def support_parameterized_circuit(self, new_value): """ set whether or not the sub-class support parameterized circuit """ self._support_parameterized_circuit = new_value @property def num_qubits(self): """Number of qubits of the variational form. Returns: int: An integer indicating the number of qubits. """ return self._num_qubits @property def parameter_bounds(self): """Parameter bounds. Returns: list: A list of pairs indicating the bounds, as (lower, upper). None indicates an unbounded parameter in the corresponding direction. If None is returned, problem is fully unbounded. """ return self._bounds @property def setting(self): """ setting """ ret = "Variational Form: {}\n".format(self.__class__.__name__) params = "" for key, value in self.__dict__.items(): if key[0] == "_": params += "-- {}: {}\n".format(key[1:], value) ret += "{}".format(params) return ret @property def preferred_init_points(self): """ Return preferred init points. If an initial state is provided then the variational form may provide back this set of parameters which when used on the variational form should result in the overall state being that defined by the initial state """ return None
[docs] @staticmethod def get_entangler_map(map_type, num_qubits, offset=0): """ returns entangler map """ return get_entangler_map(map_type, num_qubits, offset)
[docs] @staticmethod def validate_entangler_map(entangler_map, num_qubits): """ validate entangler map """ return validate_entangler_map(entangler_map, num_qubits)