Skip to content
This repository was archived by the owner on Dec 7, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ disable=no-self-use, # disabled as it is too verbose
too-many-public-methods, too-few-public-methods, too-many-ancestors,
unnecessary-pass, # allow for methods with just "pass", for clarity
no-else-return, # relax "elif" after a clause with a return
docstring-first-line-empty # relax docstring style
docstring-first-line-empty, # relax docstring style
import-outside-toplevel



Expand Down Expand Up @@ -119,7 +120,7 @@ evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / stateme
# op = operation iterator
# b = basis iterator
good-names=i,j,k,n,m,ex,v,w,x,y,z,Run,_,logger,q,c,r,qr,cr,qc,nd,pi,op,b,ar,br,
__unittest
__unittest,iSwapGate

# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,toto,tutu,tata
Expand Down Expand Up @@ -172,7 +173,7 @@ attr-rgx=[a-z_][a-z0-9_]{2,30}$
attr-name-hint=[a-z_][a-z0-9_]{2,30}$

# Regular expression matching correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$
argument-rgx=[a-z_][a-z0-9_]{2,30}|ax|dt$

# Naming hint for argument names
argument-name-hint=[a-z_][a-z0-9_]{2,30}$
Expand Down Expand Up @@ -297,7 +298,7 @@ ignore-mixin-members=yes
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules=matplotlib.cm,numpy.random
ignored-modules=matplotlib.cm,numpy.random,retworkx

# List of class names for which member attributes should not be checked (useful
# for classes with dynamically set attributes). This supports the use of
Expand Down
9 changes: 3 additions & 6 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,25 +87,22 @@ stage_test_aqua: &stage_test_aqua
install:
- |
cat > selection.txt <<EOF
test.aqua.operators.test_tpb_grouped_weigted_pauli_operator
test.aqua.operators.test_tpb_grouped_weighted_pauli_operator
test.aqua.operators.test_weighted_pauli_operator
test.aqua.test_custom_circuit_oracle
test.aqua.test_entangler_map
test.aqua.test_eoh
test.aqua.test_exact_eigen_solver
test.aqua.test_exact_ls_solver
test.aqua.test_fixed_value_comparator
test.aqua.test_hhl
test.aqua.test_initial_state_custom
test.aqua.test_initial_state_zero
test.aqua.test_input_parser
test.aqua.test_iqpe
test.aqua.test_logical_expression_oracle
test.aqua.test_lookup_rotation
test.aqua.test_mct
test.aqua.test_mcu1
test.aqua.test_measure_error_mitigation
test.aqua.test_nlopt_optimizers
test.aqua.test_numpy_eigen_solver
test.aqua.test_numpy_ls_solver
test.aqua.test_optimizers
test.aqua.test_qgan
test.aqua.test_qpe
Expand Down
17 changes: 11 additions & 6 deletions qiskit/aqua/algorithms/amplitude_amplifiers/grover.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,16 @@
The Grover's Search algorithm.
"""

from typing import Optional
from typing import Optional, Union
import logging
import operator
import numpy as np

from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.qasm import pi
from qiskit.providers import BaseBackend

from qiskit.aqua import AquaError
from qiskit.aqua import QuantumInstance, AquaError
from qiskit.aqua.utils import get_subsystem_density_matrix
from qiskit.aqua.utils.validation import validate_min, validate_in_set
from qiskit.aqua.algorithms import QuantumAlgorithm
Expand Down Expand Up @@ -76,9 +77,12 @@ class Grover(QuantumAlgorithm):
and be used with Grover algorithm to find a satisfiable assignment.
"""

def __init__(self, oracle: Oracle, init_state: Optional[InitialState] = None,
incremental: bool = False, num_iterations: int = 1,
mct_mode: str = 'basic') -> None:
def __init__(self,
oracle: Oracle, init_state: Optional[InitialState] = None,
incremental: bool = False,
num_iterations: int = 1,
mct_mode: str = 'basic',
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
r"""
Args:
oracle: The oracle component
Expand All @@ -98,6 +102,7 @@ def __init__(self, oracle: Oracle, init_state: Optional[InitialState] = None,
repeated to amplify the amplitude(s) of the target(s). Has a minimum value of 1.
mct_mode: Multi-Control Toffoli mode ('basic' | 'basic-dirty-ancilla' |
'advanced' | 'noancilla')
quantum_instance: Quantum Instance or Backend

Raises:
AquaError: evaluate_classically() missing from the input oracle
Expand All @@ -106,7 +111,7 @@ def __init__(self, oracle: Oracle, init_state: Optional[InitialState] = None,
validate_in_set('mct_mode', mct_mode,
{'basic', 'basic-dirty-ancilla',
'advanced', 'noancilla'})
super().__init__()
super().__init__(quantum_instance)

if not callable(getattr(oracle, "evaluate_classically", None)):
raise AquaError(
Expand Down
9 changes: 6 additions & 3 deletions qiskit/aqua/algorithms/amplitude_estimators/ae.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
from scipy.optimize import bisect

from qiskit import QuantumCircuit
from qiskit.aqua import AquaError
from qiskit.providers import BaseBackend
from qiskit.aqua import QuantumInstance, AquaError
from qiskit.aqua.utils import CircuitFactory
from qiskit.aqua.circuits import PhaseEstimationCircuit
from qiskit.aqua.components.iqfts import IQFT, Standard
Expand Down Expand Up @@ -53,7 +54,8 @@ def __init__(self, num_eval_qubits: int,
a_factory: Optional[CircuitFactory] = None,
q_factory: Optional[CircuitFactory] = None,
i_objective: Optional[int] = None,
iqft: Optional[IQFT] = None) -> None:
iqft: Optional[IQFT] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
r"""
Args:
num_eval_qubits: Number of evaluation qubits, has a min. value of 1.
Expand All @@ -64,9 +66,10 @@ def __init__(self, num_eval_qubits: int,
with the state \|1> and 'bad' solutions with the state \|0>.
iqft: The Inverse Quantum Fourier Transform component, defaults to using a standard IQFT
when None
quantum_instance: Quantum Instance or Backend
"""
validate_min('num_eval_qubits', num_eval_qubits, 1)
super().__init__(a_factory, q_factory, i_objective)
super().__init__(a_factory, q_factory, i_objective, quantum_instance)

# get parameters
self._m = num_eval_qubits
Expand Down
21 changes: 18 additions & 3 deletions qiskit/aqua/algorithms/amplitude_estimators/ae_algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,14 @@
The Amplitude Estimation Algorithm.
"""

from typing import Optional, Union
import logging
from abc import abstractmethod

from qiskit.providers import BaseBackend
from qiskit.aqua import QuantumInstance
from qiskit.aqua.algorithms import QuantumAlgorithm

from qiskit.aqua.utils import CircuitFactory
from .q_factory import QFactory

logger = logging.getLogger(__name__)
Expand All @@ -46,12 +49,24 @@ class AmplitudeEstimationAlgorithm(QuantumAlgorithm):
"""

@abstractmethod
def __init__(self, a_factory=None, q_factory=None, i_objective=None):
def __init__(self,
a_factory: Optional[CircuitFactory] = None,
q_factory: Optional[CircuitFactory] = None,
i_objective: Optional[int] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
"""
Args:
a_factory: The A operator, specifying the QAE problem
q_factory: The Q operator (Grover operator), constructed from the
A operator
i_objective: Index of the objective qubit, that marks the 'good/bad' states
quantum_instance: Quantum Instance or Backend
"""
self._a_factory = a_factory
self._q_factory = q_factory
self._i_objective = i_objective

super().__init__()
super().__init__(quantum_instance)

@property
def a_factory(self):
Expand Down
9 changes: 6 additions & 3 deletions qiskit/aqua/algorithms/amplitude_estimators/iqae.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
from scipy.stats import beta

from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit
from qiskit.aqua import AquaError
from qiskit.providers import BaseBackend
from qiskit.aqua import QuantumInstance, AquaError
from qiskit.aqua.utils.circuit_factory import CircuitFactory
from qiskit.aqua.utils.validation import validate_range, validate_in_set

Expand All @@ -47,7 +48,8 @@ def __init__(self, epsilon: float, alpha: float,
confint_method: str = 'beta', min_ratio: float = 2,
a_factory: Optional[CircuitFactory] = None,
q_factory: Optional[CircuitFactory] = None,
i_objective: Optional[int] = None) -> None:
i_objective: Optional[int] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
"""
The output of the algorithm is an estimate for the amplitude `a`, that with at least
probability 1 - alpha has an error of epsilon. The number of A operator calls scales
Expand All @@ -64,6 +66,7 @@ def __init__(self, epsilon: float, alpha: float,
q_factory: The Q operator (Grover operator), constructed from the
A operator
i_objective: Index of the objective qubit, that marks the 'good/bad' states
quantum_instance: Quantum Instance or Backend

Raises:
AquaError: if the method to compute the confidence intervals is not supported
Expand All @@ -73,7 +76,7 @@ def __init__(self, epsilon: float, alpha: float,
validate_range('alpha', alpha, 0, 1)
validate_in_set('confint_method', confint_method, {'chernoff', 'beta'})

super().__init__(a_factory, q_factory, i_objective)
super().__init__(a_factory, q_factory, i_objective, quantum_instance)

# store parameters
self._epsilon = epsilon
Expand Down
9 changes: 6 additions & 3 deletions qiskit/aqua/algorithms/amplitude_estimators/mlae.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
from scipy.optimize import brute
from scipy.stats import norm, chi2

from qiskit.providers import BaseBackend
from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit
from qiskit.aqua import AquaError
from qiskit.aqua import QuantumInstance, AquaError
from qiskit.aqua.utils.circuit_factory import CircuitFactory
from qiskit.aqua.utils.validation import validate_min
from .ae_algorithm import AmplitudeEstimationAlgorithm
Expand All @@ -45,7 +46,8 @@ def __init__(self, num_oracle_circuits: int,
a_factory: Optional[CircuitFactory] = None,
q_factory: Optional[CircuitFactory] = None,
i_objective: Optional[int] = None,
likelihood_evals: Optional[int] = None) -> None:
likelihood_evals: Optional[int] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
r"""
Args:
num_oracle_circuits: The number of circuits applying different powers of the Grover
Expand All @@ -60,9 +62,10 @@ def __init__(self, num_oracle_circuits: int,
with the state \|1> and 'bad' solutions with the state \|0>
likelihood_evals: The number of gridpoints for the maximum search of the likelihood
function
quantum_instance: Quantum Instance or Backend
"""
validate_min('num_oracle_circuits', num_oracle_circuits, 1)
super().__init__(a_factory, q_factory, i_objective)
super().__init__(a_factory, q_factory, i_objective, quantum_instance)

# get parameters
self._evaluation_schedule = [0] + [2**j for j in range(num_oracle_circuits)]
Expand Down
12 changes: 7 additions & 5 deletions qiskit/aqua/algorithms/classifiers/qsvm/qsvm.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

"""Quantum SVM algorithm."""

from typing import Dict, Optional
from typing import Dict, Optional, Union
import logging
import sys

Expand All @@ -23,8 +23,8 @@
from qiskit.tools import parallel_map
from qiskit.tools.events import TextProgressBar
from qiskit.circuit import ParameterVector

from qiskit.aqua import aqua_globals
from qiskit.providers import BaseBackend
from qiskit.aqua import QuantumInstance, aqua_globals
from qiskit.aqua.algorithms import QuantumAlgorithm
from qiskit.aqua import AquaError
from qiskit.aqua.utils.dataset_helper import get_num_classes
Expand Down Expand Up @@ -80,7 +80,8 @@ def __init__(self, feature_map: FeatureMap,
training_dataset: Optional[Dict[str, np.ndarray]] = None,
test_dataset: Optional[Dict[str, np.ndarray]] = None,
datapoints: Optional[np.ndarray] = None,
multiclass_extension: Optional[MulticlassExtension] = None) -> None:
multiclass_extension: Optional[MulticlassExtension] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
"""
Args:
feature_map: Feature map module, used to transform data
Expand All @@ -89,11 +90,12 @@ def __init__(self, feature_map: FeatureMap,
datapoints: Prediction dataset.
multiclass_extension: If number of classes is greater than 2 then a multiclass scheme
must be supplied, in the form of a multiclass extension.
quantum_instance: Quantum Instance or Backend

Raises:
AquaError: Multiclass extension not supplied when number of classes > 2
"""
super().__init__()
super().__init__(quantum_instance)
# check the validity of provided arguments if possible
if training_dataset is not None:
is_multiclass = get_num_classes(training_dataset) > 2
Expand Down
13 changes: 8 additions & 5 deletions qiskit/aqua/algorithms/classifiers/vqc.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

""" The Variational Quantum Classifier algorithm """

from typing import Optional, Callable, Dict
from typing import Optional, Callable, Dict, Union
import logging
import math
import numpy as np
Expand All @@ -23,7 +23,8 @@
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
from qiskit.circuit import ParameterVector

from qiskit.aqua import AquaError
from qiskit.providers import BaseBackend
from qiskit.aqua import QuantumInstance, AquaError
from qiskit.aqua.utils import map_label_to_class_name
from qiskit.aqua.utils import split_dataset_to_data_and_labels
from qiskit.aqua.algorithms import VQAlgorithm
Expand Down Expand Up @@ -56,8 +57,8 @@ def __init__(
datapoints: Optional[np.ndarray] = None,
max_evals_grouped: int = 1,
minibatch_size: int = -1,
callback: Optional[Callable[[int, np.ndarray, float, int], None]] = None
) -> None:
callback: Optional[Callable[[int, np.ndarray, float, int], None]] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
"""
Args:
optimizer: The classical optimizer to use.
Expand All @@ -73,6 +74,7 @@ def __init__(
Four parameter values are passed to the callback as follows during each evaluation.
These are: the evaluation count, parameters of the variational form,
the evaluated value, the index of data batch.
quantum_instance: Quantum Instance or Backend
Note:
We use `label` to denotes numeric results and `class` the class names (str).
Raises:
Expand All @@ -81,7 +83,8 @@ def __init__(
super().__init__(
var_form=var_form,
optimizer=optimizer,
cost_fn=self._cost_function_wrapper
cost_fn=self._cost_function_wrapper,
quantum_instance=quantum_instance
)
self._batches = None
self._label_batches = None
Expand Down
11 changes: 7 additions & 4 deletions qiskit/aqua/algorithms/distribution_learners/qgan.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,16 @@
<https://www.nature.com/articles/s41534-019-0223-2>`_
"""

from typing import Optional
from typing import Optional, Union
import csv
import os
import logging

import numpy as np
from scipy.stats import entropy

from qiskit.aqua import AquaError, aqua_globals
from qiskit.providers import BaseBackend
from qiskit.aqua import QuantumInstance, AquaError, aqua_globals
from qiskit.aqua.algorithms import QuantumAlgorithm
from qiskit.aqua.components.neural_networks.discriminative_network import DiscriminativeNetwork
from qiskit.aqua.components.neural_networks.generative_network import GenerativeNetwork
Expand Down Expand Up @@ -65,7 +66,8 @@ def __init__(self, data: np.ndarray, bounds: Optional[np.ndarray] = None,
num_epochs: int = 3000, seed: int = 7,
discriminator: Optional[DiscriminativeNetwork] = None,
generator: Optional[GenerativeNetwork] = None,
tol_rel_ent: Optional[float] = None, snapshot_dir: Optional[str] = None) -> None:
tol_rel_ent: Optional[float] = None, snapshot_dir: Optional[str] = None,
quantum_instance: Optional[Union[QuantumInstance, BaseBackend]] = None) -> None:
"""

Args:
Expand All @@ -84,11 +86,12 @@ def __init__(self, data: np.ndarray, bounds: Optional[np.ndarray] = None,
If the training achieves relative entropy equal or lower than tolerance it finishes.
snapshot_dir: Directory in to which to store cvs file with parameters,
if None (default) then no cvs file is created.
quantum_instance: Quantum Instance or Backend
Raises:
AquaError: invalid input
"""
validate_min('batch_size', batch_size, 1)
super().__init__()
super().__init__(quantum_instance)
if data is None:
raise AquaError('Training data not given.')
self._data = np.array(data)
Expand Down
Loading