Skip to content

Commit

Permalink
Typing inference module.
Browse files Browse the repository at this point in the history
  • Loading branch information
vnmabus committed Sep 2, 2022
1 parent 2f7bdc9 commit 4bd5ce2
Show file tree
Hide file tree
Showing 12 changed files with 4,786 additions and 40 deletions.
4,725 changes: 4,725 additions & 0 deletions mypy.out

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions skfda/_utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
],
submod_attrs={
"_utils": [
"RandomStateLike",
"_cartesian_product",
"_check_array_key",
"_check_estimator",
Expand All @@ -36,7 +35,6 @@
if TYPE_CHECKING:

from ._utils import (
RandomStateLike as RandomStateLike,
_cartesian_product as _cartesian_product,
_check_array_key as _check_array_key,
_check_estimator as _check_estimator,
Expand Down
2 changes: 0 additions & 2 deletions skfda/_utils/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@
from ..typing._numpy import NDArrayAny, NDArrayFloat, NDArrayInt, NDArrayStr
from ._sklearn_adapter import BaseEstimator

RandomStateLike = Optional[Union[int, np.random.RandomState]]

ArrayDTypeT = TypeVar("ArrayDTypeT", bound="np.generic")

if TYPE_CHECKING:
Expand Down
21 changes: 8 additions & 13 deletions skfda/datasets/_samples_generators.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,14 @@

import numpy as np
import scipy.integrate
import sklearn.utils
from scipy.stats import multivariate_normal

from .._utils import (
RandomStateLike,
_cartesian_product,
_to_grid_points,
normalize_warping,
)
from .._utils import _cartesian_product, _to_grid_points, normalize_warping
from ..misc import covariances
from ..misc.validation import validate_random_state
from ..representation import FDataGrid
from ..representation.interpolation import SplineInterpolation
from ..typing._base import DomainRangeLike, GridPointsLike
from ..typing._base import DomainRangeLike, GridPointsLike, RandomStateLike
from ..typing._numpy import NDArrayFloat

MeanCallable = Callable[[np.ndarray], np.ndarray]
Expand Down Expand Up @@ -62,7 +57,7 @@ def make_gaussian(
Gaussian processes.
"""
random_state = sklearn.utils.check_random_state(random_state)
random_state = validate_random_state(random_state)

if cov is None:
cov = covariances.Brownian()
Expand Down Expand Up @@ -193,7 +188,7 @@ def make_sinusoidal_process(
:class:`FDataGrid` object comprising all the samples.
"""
random_state = sklearn.utils.check_random_state(random_state)
random_state = validate_random_state(random_state)

t = np.linspace(start, stop, n_features)

Expand Down Expand Up @@ -256,7 +251,7 @@ def make_multimodal_landmarks(
sample i.
"""
random_state = sklearn.utils.check_random_state(random_state)
random_state = validate_random_state(random_state)

modes_location = np.linspace(start, stop, n_modes + 2)[1:-1]
modes_location = np.repeat(
Expand Down Expand Up @@ -329,7 +324,7 @@ def make_multimodal_samples(
:class:`FDataGrid` object comprising all the samples.
"""
random_state = sklearn.utils.check_random_state(random_state)
random_state = validate_random_state(random_state)

if modes_location is None:

Expand Down Expand Up @@ -446,7 +441,7 @@ def make_random_warping(
# Based on the original implementation of J. D. Tucker in the
# package python_fdasrsf <https://github.com/jdtuck/fdasrsf_python>.

random_state = sklearn.utils.check_random_state(random_state)
random_state = validate_random_state(random_state)

freq = shape_parameter + 1

Expand Down
6 changes: 3 additions & 3 deletions skfda/exploratory/outliers/_directional_outlyingness.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
import scipy.stats
from numpy import linalg as la
from sklearn.covariance import MinCovDet
from sklearn.utils.validation import check_random_state

from ..._utils import RandomStateLike
from ..._utils._sklearn_adapter import BaseEstimator, OutlierMixin
from ...misc.validation import validate_random_state
from ...representation import FDataGrid
from ...typing._base import RandomStateLike
from ...typing._numpy import NDArrayFloat, NDArrayInt
from ..depth.multivariate import Depth, ProjectionDepth
from . import _directional_outlyingness_experiment_results as experiments
Expand Down Expand Up @@ -495,7 +495,7 @@ def fit_predict( # noqa: D102
y: object = None,
) -> NDArrayInt:

self.random_state_ = check_random_state(self.random_state)
self.random_state_ = validate_random_state(self.random_state)
self.points_ = self._compute_points(X)

# The square mahalanobis distances of the samples are
Expand Down
10 changes: 9 additions & 1 deletion skfda/inference/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
from . import anova, hotelling
import lazy_loader as lazy

__getattr__, __dir__, __all__ = lazy.attach(
__name__,
submodules=[
"anova",
"hotelling",
],
)
13 changes: 6 additions & 7 deletions skfda/inference/anova/_anova_oneway.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
from typing import Sequence, Tuple, TypeVar, overload

import numpy as np
from sklearn.utils import check_random_state
from typing_extensions import Literal

from ..._utils import RandomStateLike
from ...datasets import make_gaussian
from ...misc.metrics import lp_distance
from ...misc.validation import validate_random_state
from ...representation import FData, FDataGrid, concatenate
from ...typing._base import RandomStateLike
from ...typing._numpy import ArrayLike, NDArrayFloat


Expand Down Expand Up @@ -95,7 +95,7 @@ def _v_asymptotic_stat_with_reps(
*fds: FData,
weights: ArrayLike,
p: int = 2,
) -> float:
) -> NDArrayFloat:
"""Vectorized version of v_asymptotic_stat for repetitions."""
weights = np.asarray(weights)
if len(weights) != len(fds):
Expand All @@ -112,7 +112,7 @@ def _v_asymptotic_stat_with_reps(
right_fd = fds[pair[0]] * coef
results[i] = lp_distance(left_fd, right_fd, p=p) ** p

return np.sum(results, axis=0)
return np.sum(results, axis=0) # type: ignore[no-any-return]


def v_asymptotic_stat(
Expand Down Expand Up @@ -206,7 +206,7 @@ def _anova_bootstrap(
sizes = [fd.n_samples for fd in fd_grouped]

# Instance a random state object in case random_state is an int
random_state = check_random_state(random_state)
random_state = validate_random_state(random_state)

if equal_var:
k_est = concatenate(fd_grouped).cov().data_matrix[0, ..., 0]
Expand All @@ -233,7 +233,6 @@ def _anova_bootstrap(
for i in range(n_groups)
]

v_samples = np.empty(n_reps)
return _v_asymptotic_stat_with_reps(*sim, weights=sizes, p=p)


Expand Down Expand Up @@ -385,7 +384,7 @@ def oneway_anova(
equal_var=equal_var,
)

p_value = np.sum(simulation > vn) / len(simulation)
p_value = float(np.sum(simulation > vn) / len(simulation))

if return_dist:
return vn, p_value, simulation
Expand Down
12 changes: 6 additions & 6 deletions skfda/inference/hotelling/_hotelling.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@

import numpy as np
import scipy.special
from sklearn.utils import check_random_state
from typing_extensions import Literal

from ..._utils import RandomStateLike
from ...misc.validation import validate_random_state
from ...representation import FData, FDataBasis
from ...typing._base import RandomStateLike
from ...typing._numpy import NDArrayFloat


Expand Down Expand Up @@ -188,8 +188,8 @@ def hotelling_test_ind(
TypeError: In case of bad arguments.
Examples:
>>> from skfda.inference.hotelling import hotelling_t2
>>> from skfda.representation import FDataGrid, basis
>>> from skfda.inference.hotelling import hotelling_test_ind
>>> from skfda.representation import FDataGrid
>>> from numpy import printoptions
>>> fd1 = FDataGrid([[1, 1, 1], [3, 3, 3]])
Expand Down Expand Up @@ -223,7 +223,7 @@ def hotelling_test_ind(
indices = np.arange(n)

if n_reps is not None: # Computing n_reps random permutations
random_state = check_random_state(random_state)
random_state = validate_random_state(random_state)
dist = np.empty(n_reps)
for i in range(n_reps):
random_state.shuffle(indices)
Expand All @@ -238,7 +238,7 @@ def hotelling_test_ind(
sample1, sample2 = sample[sample1_i], sample[sample2_i]
dist[i] = hotelling_t2(sample1, sample2)

p_value = np.sum(dist > t2_0) / len(dist)
p_value = float(np.sum(dist > t2_0) / len(dist))

if return_dist:
return t2_0, p_value, dist
Expand Down
17 changes: 16 additions & 1 deletion skfda/misc/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@
from typing import Container, Sequence, Tuple, cast

import numpy as np
from sklearn.utils import check_random_state as _check_random_state

from ..representation import FData, FDataBasis, FDataGrid
from ..typing._base import DomainRange, DomainRangeLike, EvaluationPoints
from ..typing._base import (
DomainRange,
DomainRangeLike,
EvaluationPoints,
RandomState,
RandomStateLike,
)
from ..typing._numpy import ArrayLike


Expand Down Expand Up @@ -255,3 +262,11 @@ def validate_domain_range(domain_range: DomainRangeLike) -> DomainRange:
domain_range = cast(Sequence[Sequence[float]], domain_range)

return tuple(_validate_domain_range_limits(s) for s in domain_range)


def validate_random_state(random_state: RandomStateLike) -> RandomState:
"""Validate random state or seed."""
if isinstance(random_state, np.random.Generator):
return random_state

return _check_random_state(random_state) # type: ignore[no-any-return]
10 changes: 6 additions & 4 deletions skfda/ml/clustering/_kmeans.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@

import numpy as np
from sklearn.base import BaseEstimator, ClusterMixin, TransformerMixin
from sklearn.utils import check_random_state
from sklearn.utils.validation import check_is_fitted

from ..._utils import RandomStateLike
from ...misc.metrics import PairwiseMetric, l2_distance
from ...misc.validation import check_fdata_same_dimensions
from ...misc.validation import (
check_fdata_same_dimensions,
validate_random_state,
)
from ...representation import FDataGrid
from ...typing._base import RandomStateLike
from ...typing._metric import Metric
from ...typing._numpy import NDArrayAny, NDArrayFloat, NDArrayInt

Expand Down Expand Up @@ -309,7 +311,7 @@ def fit(
"""
fdata = self._check_clustering(X)
random_state = check_random_state(self.random_state)
random_state = validate_random_state(self.random_state)

self._check_params()

Expand Down
3 changes: 2 additions & 1 deletion skfda/preprocessing/dim_reduction/variable_selection/mrmr.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
)
from typing_extensions import Final, Literal

from ...._utils import RandomStateLike, _compute_dependence, _DependenceMeasure
from ...._utils import _compute_dependence, _DependenceMeasure
from ...._utils._sklearn_adapter import (
BaseEstimator,
InductiveTransformerMixin,
)
from ....representation.grid import FDataGrid
from ....typing._base import RandomStateLike
from ....typing._numpy import NDArrayFloat, NDArrayInt, NDArrayReal

_Criterion = Callable[[NDArrayFloat, NDArrayFloat], NDArrayFloat]
Expand Down
5 changes: 5 additions & 0 deletions skfda/typing/_base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""Common types."""
from typing import Optional, Sequence, Tuple, TypeVar, Union

import numpy as np
from typing_extensions import Protocol

from ._numpy import ArrayLike, NDArrayFloat
Expand All @@ -23,6 +24,10 @@
EvaluationPoints = NDArrayFloat


RandomStateLike = Union[int, np.random.RandomState, np.random.Generator, None]
RandomState = Union[np.random.RandomState, np.random.Generator]


class Vector(Protocol):
"""
Protocol representing a generic vector.
Expand Down

0 comments on commit 4bd5ce2

Please sign in to comment.