Skip to content
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
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ dependencies = [
"qiskit-ibm-runtime>=0.18.0",
"qiskit-machine-learning>=0.7.0",
"scipy>=1.8.0",
"scikit-learn>=1.2.0,<1.4.2",
"scikit-learn>=1.2.0",
"tqdm>=4.1.0",
]
requires-python = ">=3.9,<3.13"
Expand Down
16 changes: 14 additions & 2 deletions src/squlearn/kernel/qgpr.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
"""Quantum Gaussian Process Regression"""

import warnings
from packaging import version

import numpy as np
from typing import Optional, Union
from scipy.linalg import cholesky, cho_solve
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn.preprocessing._data import _handle_zeros_in_scale

from sklearn import __version__

if version.parse(__version__) >= version.parse("1.6"):
from sklearn.utils.validation import validate_data
else:

def validate_data(self, *args, **kwargs):
return self._validate_data(*args, **kwargs)


from .lowlevel_kernel.kernel_matrix_base import KernelMatrixBase
from .lowlevel_kernel.regularization import regularize_full_kernel

Expand Down Expand Up @@ -123,7 +134,8 @@ def fit(self, X, y):
Returns an instance of self.
"""

X, y = self._validate_data(
X, y = validate_data(
self,
X,
y,
multi_output=True,
Expand Down Expand Up @@ -201,7 +213,7 @@ def predict(self, X: np.ndarray, return_std=False, return_cov=False):
Only returned when `return_cov` is True.
"""

X = self._validate_data(X, ensure_2d=True, dtype="numeric", reset=False)
X = validate_data(self, X, ensure_2d=True, dtype="numeric", reset=False)

if self.K_train is None:
raise ValueError("There is no training data. Please call the fit method first.")
Expand Down
17 changes: 14 additions & 3 deletions src/squlearn/kernel/qkrr.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
"""Quantum Kernel Ridge Regression"""

from packaging import version

import scipy
import numpy as np
from typing import Optional, Union
from sklearn.base import BaseEstimator, RegressorMixin
from sklearn import __version__

if version.parse(__version__) >= version.parse("1.6"):
from sklearn.utils.validation import validate_data
else:

def validate_data(self, *args, **kwargs):
return self._validate_data(*args, **kwargs)


from .lowlevel_kernel.kernel_matrix_base import KernelMatrixBase
from .lowlevel_kernel.regularization import thresholding_regularization, tikhonov_regularization
Expand Down Expand Up @@ -122,8 +133,8 @@ def fit(self, X, y):
Returns an instance of self.
"""

X, y = self._validate_data(
X, y, accept_sparse=("csr", "csc"), multi_output=True, y_numeric=True
X, y = validate_data(
self, X, y, accept_sparse=("csr", "csc"), multi_output=True, y_numeric=True
)

self.X_train = X
Expand Down Expand Up @@ -172,7 +183,7 @@ def predict(self, X: np.ndarray) -> np.ndarray:
if self.k_train is None:
raise ValueError("The fit() method has to be called beforehand.")

X = self._validate_data(X, accept_sparse=("csr", "csc"), reset=False)
X = validate_data(self, X, accept_sparse=("csr", "csc"), reset=False)

if isinstance(self._quantum_kernel, str):
if self._quantum_kernel == "precomputed":
Expand Down
13 changes: 12 additions & 1 deletion src/squlearn/qnn/base_qnn.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,22 @@
from __future__ import annotations

from abc import abstractmethod, ABC
from packaging import version
from typing import Callable, Union
from warnings import warn

import numpy as np
from sklearn.base import BaseEstimator
from sklearn.utils import column_or_1d
from sklearn import __version__

if version.parse(__version__) >= version.parse("1.6"):
from sklearn.utils.validation import validate_data
else:

def validate_data(self, *args, **kwargs):
return self._validate_data(*args, **kwargs)


from ..observables.observable_base import ObservableBase
from ..encoding_circuit.encoding_circuit_base import EncodingCircuitBase
Expand Down Expand Up @@ -339,7 +349,8 @@ def _initialize_lowlevel_qnn(self):
)

def _validate_input(self, X, y, incremental, reset):
X, y = self._validate_data(
X, y = validate_data(
self,
X,
y,
accept_sparse=["csr", "csc"],
Expand Down
13 changes: 12 additions & 1 deletion src/squlearn/qnn/qnnc.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
"""QNNClassifier Implemenation"""

from packaging import version
from typing import Callable, Union
import sys

import numpy as np
from sklearn.base import ClassifierMixin
from sklearn.preprocessing import LabelBinarizer
from sklearn import __version__

if version.parse(__version__) >= version.parse("1.6"):
from sklearn.utils.validation import validate_data
else:

def validate_data(self, *args, **kwargs):
return self._validate_data(*args, **kwargs)


from tqdm import tqdm

from .base_qnn import BaseQNN
Expand Down Expand Up @@ -155,7 +166,7 @@ def predict(self, X: np.ndarray) -> np.ndarray:
Returns:
np.ndarray : The predicted values.
"""
X = self._validate_data(X, accept_sparse=["csr", "csc"], reset=False)
X = validate_data(self, X, accept_sparse=["csr", "csc"], reset=False)

if not self._is_fitted and not self.pretrained:
raise RuntimeError("The model is not fitted.")
Expand Down
13 changes: 12 additions & 1 deletion src/squlearn/qnn/qnnr.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
"""QNNRegressor Implemenation"""

from packaging import version
from typing import Callable, Union
from warnings import warn
import sys

import numpy as np
from sklearn.base import RegressorMixin
from sklearn import __version__

if version.parse(__version__) >= version.parse("1.6"):
from sklearn.utils.validation import validate_data
else:

def validate_data(self, *args, **kwargs):
return self._validate_data(*args, **kwargs)


from tqdm import tqdm

from .base_qnn import BaseQNN
Expand Down Expand Up @@ -205,7 +216,7 @@ def predict(self, X: np.ndarray) -> np.ndarray:
Returns:
np.ndarray : The predicted values.
"""
X = self._validate_data(X, accept_sparse=["csr", "csc"], reset=False)
X = validate_data(self, X, accept_sparse=["csr", "csc"], reset=False)

if not self._is_fitted and not self.pretrained:
warn("The model is not fitted.")
Expand Down
16 changes: 14 additions & 2 deletions src/squlearn/qrc/base_qrc.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
import numpy as np
from typing import Union, List
from abc import abstractmethod, ABC
from packaging import version

from sklearn.base import BaseEstimator
from sklearn.utils import column_or_1d
from sklearn import __version__

if version.parse(__version__) >= version.parse("1.6"):
from sklearn.utils.validation import validate_data
else:

def validate_data(self, *args, **kwargs):
return self._validate_data(*args, **kwargs)


from qiskit.quantum_info.random import random_pauli_list

from ..observables.observable_base import ObservableBase
Expand Down Expand Up @@ -118,7 +129,7 @@ def predict(self, X) -> np.ndarray:
Returns:
np.ndarray : The predicted values.
"""
X = self._validate_data(X, accept_sparse=["csr", "csc"], reset=False)
X = validate_data(self, X, accept_sparse=["csr", "csc"], reset=False)
X_qnn = self._qnn.evaluate(X, self.param_ini, self.param_op_ini, "f")["f"]
return self._ml_model.predict(X_qnn)

Expand Down Expand Up @@ -278,7 +289,8 @@ def set_params(self, **params) -> "BaseQRC":
return self

def _validate_input(self, X, y, incremental, reset):
X, y = self._validate_data(
X, y = validate_data(
self,
X,
y,
accept_sparse=["csr", "csc"],
Expand Down