From a328dfe13bcd8140a625546866376669744b09d2 Mon Sep 17 00:00:00 2001 From: iraedeus Date: Thu, 17 Jul 2025 21:59:30 +0300 Subject: [PATCH 1/3] chore: add pre-commit --- .github/workflows/check.yml | 22 ++++++++-------------- .pre-commit-config.yaml | 33 +++++++++++++++++++++++++++++++++ pyproject.toml | 7 ++++++- 3 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 7a842c8e..ceef8d24 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -11,27 +11,21 @@ jobs: python-version: [ "3.11", "3.12", "3.13" ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - - name: Install poetry - run: pipx install poetry + - name: Install Poetry + uses: snok/install-poetry@v1 - name: Install dependencies run: poetry install --with dev - - name: Ruff - run: poetry run ruff check + - name: Run Pre-commit hooks + run: poetry run pre-commit run --all-files - - name: Install stubs - run: poetry run pip install types-PyYAML types-tqdm - - - name: Mypy - run: poetry run mypy - - - name: Pytest - run: poetry run python -m pytest tests \ No newline at end of file + - name: Run tests + run: poetry run python -m pytest tests diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..72392ebb --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,33 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - id: check-merge-conflict + - id: check-ast + +- repo: local + hooks: + - id: ruff-check + name: ruff check + entry: poetry run ruff check --fix --exit-non-zero-on-fix + language: system + types: [python] + files: ^(mpest/|experimental_env/|tests/).* + + - id: ruff-format + name: ruff format + entry: poetry run ruff format + language: system + types: [python] + files: ^(mpest/|experimental_env/|tests/).* + + - id: mypy + name: mypy check + entry: poetry run mypy + language: system + types: [python] + pass_filenames: false diff --git a/pyproject.toml b/pyproject.toml index 75fb1cc7..8e69a365 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,8 @@ sphinx = "^8.2.0" hypothesis = "^6.131.7" myst-parser = "^4.0.1" furo = "^2024.8.6" +types-pyyaml = "^6.0.12.20250516" +types-tqdm = "^4.67.0.20250516" [tool.poetry.group.experiments.dependencies] tqdm = "^4.67.1" @@ -42,7 +44,8 @@ ruamel-yaml = "^0.18.10" [tool.ruff] line-length = 120 output-format = "grouped" -exclude = ["*.ipynb", "__init__.py", "docs"] +src = ["mpest", "experimental_env", "tests"] +exclude = ["*.ipynb"] [tool.ruff.format] quote-style = "double" @@ -53,6 +56,8 @@ docstring-code-format = true select = ["A", "E", "F", "I", "PL", "RUF", "SIM", "UP", "W"] ignore = ["PLR0913"] +[tool.ruff.lint.per-file-ignores] +"**/__init__.py" = ["F401"] [tool.mypy] files = ["mpest", "experimental_env"] From a042d2ffdbe7901530c6c9e96ae9ea5cb55651a2 Mon Sep 17 00:00:00 2001 From: iraedeus Date: Thu, 17 Jul 2025 22:00:27 +0300 Subject: [PATCH 2/3] fix: use pre-commit on entire project --- CONTRIBUTING.md | 3 --- docs/design.md | 12 ++++++------ docs/source/_static/EM algo.svg | 2 +- docs/source/index.rst | 1 - docs/source/intro.rst | 2 +- experimental_env/analysis/metrics.py | 3 +-- experimental_env/experiment/estimators.py | 6 +++--- .../experiment/experiment_description.py | 4 ++-- .../experiment_executors/abstract_executor.py | 4 ++-- .../experiment_executors/random_executor.py | 3 ++- .../experiment_executors/standart_executor.py | 3 ++- experimental_env/preparation/dataset_generator.py | 6 +++--- experimental_env/utils.py | 3 ++- mpest/__init__.py | 2 +- mpest/models/__init__.py | 6 +++--- tests/core/test_distribution.py | 1 - tests/core/test_mixture_distribution.py | 1 - tests/core/test_problem.py | 1 - .../experimental_env/test_reproducibility_expenv.py | 8 ++++---- tests/models/test_beta.py | 3 +-- tests/models/test_cauchy.py | 3 +-- tests/models/test_pareto.py | 3 +-- tests/models/test_uniform.py | 3 +-- tests/test_ml_estep/test_ml.py | 3 +-- .../test_any_distributions_complex_l.py | 2 +- .../test_any_distributions_simple_l.py | 2 +- tests/tests_l_moments/test_one_distribution_l.py | 2 +- .../test_two_same_distributions_complex_l.py | 2 +- .../test_two_same_distributions_simple_l.py | 2 +- .../test_any_distributions_complex.py | 2 +- .../test_any_distributions_simple.py | 2 +- tests/tests_likelihood/test_one_distribution.py | 2 +- .../test_two_same_distributions_complex.py | 2 +- .../test_two_same_distributions_simple.py | 2 +- tests/utils.py | 1 - 35 files changed, 48 insertions(+), 59 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7247494c..1e069924 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -98,6 +98,3 @@ For your Pull Request to be merged, it must meet the following requirements conf Each pull request must be reviewed by one of the maintainers: * Danil Totmyanin ([iraedeus](https://github.com/iraedeus)) - - - diff --git a/docs/design.md b/docs/design.md index 5be60eca..ce383e5d 100644 --- a/docs/design.md +++ b/docs/design.md @@ -64,7 +64,7 @@ ## 1.2. Цели документации -Документ предназначен для описания текущего состояния проекта `pysatl-mpest`. +Документ предназначен для описания текущего состояния проекта `pysatl-mpest`. Целевой аудиторией являются разработчики, которые будут принимать участие в разработке/расширении библиотеки. По большей части данная документация предназначается для тех, кто будет разбираться со структурой проекта на *Летней школе*. @@ -139,7 +139,7 @@ $$ #### Смеси распределений -Работа со смесями распределений идет через класс `MixtureDistribution`, который инициализируется с помощью списка объектов `Distribution`. Конкретные реализации распределений наследуются от `AModel`, после чего оборачиваются в класс `Distribution`. +Работа со смесями распределений идет через класс `MixtureDistribution`, который инициализируется с помощью списка объектов `Distribution`. Конкретные реализации распределений наследуются от `AModel`, после чего оборачиваются в класс `Distribution`. Некоторые реализации EM используют оптимизацию, при которой параметры могут выйти из области определения. Таким образом необходимо нормализовать параметры для того, чтобы они были определены на всем $\mathbb{R}$. Методы объектов `AModel` использует внутренние (internal) параметры, тогда как `Distribution` использует внешние (external) параметры, которые являются общепринятыми. @@ -160,7 +160,7 @@ $$ - `Python`: Как основной язык. - `scipy`: На эту библиотеку делегировано сэмплирование, а так же написаны адаптеры к их оптимизаторам. - `numpy`: Для векторизации. -- `matplotlib + seaborn`: Для визуализации данных (В основном используется в экспериментальном окружении). +- `matplotlib + seaborn`: Для визуализации данных (В основном используется в экспериментальном окружении). @@ -238,7 +238,7 @@ $$ - `LikelihoodMStep` (для MLE-EM): пересчитывает параметры моделей, максимизируя взвешенную логарифмическую функцию правдоподобия. Может использовать `AOptimizer` или `AOptimizerJacobian` для численной оптимизации. - `LMomentsMStep` (для ELM): пересчитывает параметры моделей на основе вычисленных L-моментов для каждого компонента смеси. - + ## 3.4. Вспомогательные @@ -352,7 +352,7 @@ $$ 3. **M-шаг:** вызывается `method.m_step.step(e_result)`: - Реализуется M-шаг алгоритма, возвращая результирующую смесь. + Реализуется M-шаг алгоритма, возвращая результирующую смесь. 4. **Обновление состояния смеси:** @@ -434,7 +434,7 @@ sequenceDiagram ### Ядро (Mpest core) -1. Класс `Distribution` хоть и является оберткой для `AModel`, но не реализует всех его методов (например `lpdf`). Таким образом, для вызова нереализованных методов необходимо вызывать `model`, что плохо. +1. Класс `Distribution` хоть и является оберткой для `AModel`, но не реализует всех его методов (например `lpdf`). Таким образом, для вызова нереализованных методов необходимо вызывать `model`, что плохо. 2. Для некоторых алгоритмов (не для всех) необходимо преобразовывать параметры так, чтобы они были на всем $\mathbb{R}$. Из-за этого появляется разделение на внутренние (*internal_params*) и внешние (*external_params*) параметры. Сейчас в коде, преобразование во внутренние параметры происходит перед началом алгоритма (для всех алгосов, даже для тех, для которых это не является необходимым), а в конце происходит переход к внешним параметрам (общепринятым). diff --git a/docs/source/_static/EM algo.svg b/docs/source/_static/EM algo.svg index bce0f916..109fc2f9 100644 --- a/docs/source/_static/EM algo.svg +++ b/docs/source/_static/EM algo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/docs/source/index.rst b/docs/source/index.rst index 75f05cfa..5fef7975 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -21,4 +21,3 @@ documentation for details. :caption: API: api/modules - diff --git a/docs/source/intro.rst b/docs/source/intro.rst index 7214381b..13b368b9 100644 --- a/docs/source/intro.rst +++ b/docs/source/intro.rst @@ -3,4 +3,4 @@ :caption: Introduction: .. include:: ../../README.md - :parser: myst_parser.sphinx_ \ No newline at end of file + :parser: myst_parser.sphinx_ diff --git a/experimental_env/analysis/metrics.py b/experimental_env/analysis/metrics.py index 6cf931e2..963dfddf 100644 --- a/experimental_env/analysis/metrics.py +++ b/experimental_env/analysis/metrics.py @@ -4,10 +4,9 @@ from itertools import permutations import numpy as np -from scipy.integrate import quad - from mpest import MixtureDistribution from mpest.utils import ANamed +from scipy.integrate import quad class AMetric(ANamed, ABC): diff --git a/experimental_env/experiment/estimators.py b/experimental_env/experiment/estimators.py index 2c608458..82eb2d4b 100644 --- a/experimental_env/experiment/estimators.py +++ b/experimental_env/experiment/estimators.py @@ -5,9 +5,6 @@ from concurrent.futures import as_completed from concurrent.futures.process import ProcessPoolExecutor -from tqdm import tqdm - -from experimental_env.utils import OrderedProblem, choose_best_mle from mpest import Problem from mpest.em import EM from mpest.em.methods.l_moments_method import LMomentsMStep @@ -15,6 +12,9 @@ from mpest.em.methods.method import Method from mpest.optimizers import ALL_OPTIMIZERS from mpest.utils import ANamed, Factory, ResultWithLog +from tqdm import tqdm + +from experimental_env.utils import OrderedProblem, choose_best_mle METHODS: dict = { "Likelihood": [[Factory(BayesEStep), Factory(LikelihoodMStep, optimizer)] for optimizer in ALL_OPTIMIZERS], diff --git a/experimental_env/experiment/experiment_description.py b/experimental_env/experiment/experiment_description.py index 7bc0d983..c367ef65 100644 --- a/experimental_env/experiment/experiment_description.py +++ b/experimental_env/experiment/experiment_description.py @@ -3,11 +3,11 @@ from collections.abc import Iterable, Iterator import numpy as np - -from experimental_env.preparation.dataset_description import DatasetDescrciption from mpest import MixtureDistribution from mpest.utils import ResultWithLog +from experimental_env.preparation.dataset_description import DatasetDescrciption + class StepDescription: """ diff --git a/experimental_env/experiment/experiment_executors/abstract_executor.py b/experimental_env/experiment/experiment_executors/abstract_executor.py index 27575811..b9614f1e 100644 --- a/experimental_env/experiment/experiment_executors/abstract_executor.py +++ b/experimental_env/experiment/experiment_executors/abstract_executor.py @@ -6,13 +6,13 @@ from pathlib import Path import numpy as np +from mpest import Problem +from mpest.models import ALL_MODELS, AModel from experimental_env.experiment.estimators import AEstimator from experimental_env.experiment.experiment_description import ExperimentDescription from experimental_env.experiment.experiment_saver import ExperimentSaver from experimental_env.preparation.dataset_description import DatasetDescrciption -from mpest import Problem -from mpest.models import ALL_MODELS, AModel class AExecutor(ABC): diff --git a/experimental_env/experiment/experiment_executors/random_executor.py b/experimental_env/experiment/experiment_executors/random_executor.py index 9e6d5774..7a660b1a 100644 --- a/experimental_env/experiment/experiment_executors/random_executor.py +++ b/experimental_env/experiment/experiment_executors/random_executor.py @@ -1,10 +1,11 @@ """A module that provides a class for generating initial mixtures with uniform distribution.""" +from mpest import Problem + from experimental_env.experiment.experiment_executors.abstract_executor import AExecutor from experimental_env.mixture_generators.random_mixture_generator import ( RandomMixtureGenerator, ) -from mpest import Problem class RandomExperimentExecutor(AExecutor): diff --git a/experimental_env/experiment/experiment_executors/standart_executor.py b/experimental_env/experiment/experiment_executors/standart_executor.py index 91e5a00b..ea7e664e 100644 --- a/experimental_env/experiment/experiment_executors/standart_executor.py +++ b/experimental_env/experiment/experiment_executors/standart_executor.py @@ -1,10 +1,11 @@ """A module that provides a class for generating initial mixtures with standart parameters""" +from mpest import Problem + from experimental_env.experiment.experiment_executors.abstract_executor import AExecutor from experimental_env.mixture_generators.standart_mixture_generator import ( StandartMixtureGenerator, ) -from mpest import Problem class StandartExperimentExecutor(AExecutor): diff --git a/experimental_env/preparation/dataset_generator.py b/experimental_env/preparation/dataset_generator.py index e60e522f..5382022b 100644 --- a/experimental_env/preparation/dataset_generator.py +++ b/experimental_env/preparation/dataset_generator.py @@ -4,15 +4,15 @@ from pathlib import Path import numpy as np +from mpest.core.distribution import Distribution +from mpest.core.mixture_distribution import MixtureDistribution +from mpest.models.abstract_model import AModel from tqdm import tqdm from experimental_env.mixture_generators.dataset_mixture_generator import ( DatasetMixtureGenerator, ) from experimental_env.preparation.dataset_saver import DatasetDescrciption, DatasetSaver -from mpest.core.distribution import Distribution -from mpest.core.mixture_distribution import MixtureDistribution -from mpest.models.abstract_model import AModel class RandomDatasetGenerator: diff --git a/experimental_env/utils.py b/experimental_env/utils.py index a30e8935..7e0111f1 100644 --- a/experimental_env/utils.py +++ b/experimental_env/utils.py @@ -3,11 +3,12 @@ import math import re -from experimental_env.analysis.metrics import Parametric from mpest import Distribution, MixtureDistribution, Problem from mpest.models import ALL_MODELS from mpest.utils import ResultWithLog +from experimental_env.analysis.metrics import Parametric + def create_mixture_by_key(config: dict, key: str) -> MixtureDistribution: """ diff --git a/mpest/__init__.py b/mpest/__init__.py index 786c7134..ac9ec171 100644 --- a/mpest/__init__.py +++ b/mpest/__init__.py @@ -4,7 +4,7 @@ """ from mpest import em, models, optimizers, utils +from mpest.annotations import Params, Samples from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import DistributionInMixture, MixtureDistribution from mpest.core.problem import Problem, Result -from mpest.annotations import Params, Samples diff --git a/mpest/models/__init__.py b/mpest/models/__init__.py index adb52e2c..423ee8a7 100644 --- a/mpest/models/__init__.py +++ b/mpest/models/__init__.py @@ -5,13 +5,13 @@ AModelDifferentiable, AModelWithGenerator, ) +from mpest.models.beta import Beta +from mpest.models.cauchy import Cauchy from mpest.models.exponential import ExponentialModel from mpest.models.gaussian import GaussianModel +from mpest.models.pareto import Pareto from mpest.models.uniform import Uniform from mpest.models.weibull import WeibullModelExp -from mpest.models.cauchy import Cauchy -from mpest.models.pareto import Pareto -from mpest.models.beta import Beta ALL_MODELS: dict[str, type[AModel]] = { GaussianModel().name: GaussianModel, diff --git a/tests/core/test_distribution.py b/tests/core/test_distribution.py index 73617b43..abfba19a 100644 --- a/tests/core/test_distribution.py +++ b/tests/core/test_distribution.py @@ -4,7 +4,6 @@ import pytest from hypothesis import given from hypothesis import strategies as st - from mpest.core.distribution import Distribution from mpest.models import AModel, AModelWithGenerator diff --git a/tests/core/test_mixture_distribution.py b/tests/core/test_mixture_distribution.py index f74e5370..9bd6c0bd 100644 --- a/tests/core/test_mixture_distribution.py +++ b/tests/core/test_mixture_distribution.py @@ -4,7 +4,6 @@ import pytest from hypothesis import given from hypothesis import strategies as st - from mpest import Distribution from mpest.core.mixture_distribution import DistributionInMixture, MixtureDistribution from mpest.models import AModel, AModelWithGenerator diff --git a/tests/core/test_problem.py b/tests/core/test_problem.py index a21f0aea..15d7b8b7 100644 --- a/tests/core/test_problem.py +++ b/tests/core/test_problem.py @@ -3,7 +3,6 @@ import numpy as np from hypothesis import given from hypothesis import strategies as st - from mpest.core.problem import Problem diff --git a/tests/experimental_env/test_reproducibility_expenv.py b/tests/experimental_env/test_reproducibility_expenv.py index 70557844..87b85e29 100644 --- a/tests/experimental_env/test_reproducibility_expenv.py +++ b/tests/experimental_env/test_reproducibility_expenv.py @@ -2,6 +2,10 @@ from pathlib import Path import numpy as np +from mpest import MixtureDistribution +from mpest.em.breakpointers import StepCountBreakpointer +from mpest.em.distribution_checkers import FiniteChecker, PriorProbabilityThresholdChecker +from mpest.models import ExponentialModel, GaussianModel, WeibullModelExp from experimental_env.experiment.estimators import LikelihoodEstimator, LMomentsEstimator from experimental_env.experiment.experiment_description import StepDescription @@ -9,10 +13,6 @@ from experimental_env.experiment.experiment_parser import ExperimentParser from experimental_env.preparation.dataset_generator import RandomDatasetGenerator from experimental_env.preparation.dataset_parser import SamplesDatasetParser -from mpest import MixtureDistribution -from mpest.em.breakpointers import StepCountBreakpointer -from mpest.em.distribution_checkers import FiniteChecker, PriorProbabilityThresholdChecker -from mpest.models import ExponentialModel, GaussianModel, WeibullModelExp def compare_mixtures(mxt_1: MixtureDistribution, mxt_2: MixtureDistribution): diff --git a/tests/models/test_beta.py b/tests/models/test_beta.py index 6a7344b6..8e2e09c0 100644 --- a/tests/models/test_beta.py +++ b/tests/models/test_beta.py @@ -4,9 +4,8 @@ import pytest from hypothesis import given from hypothesis import strategies as st -from scipy import stats - from mpest.models.beta import Beta +from scipy import stats @st.composite diff --git a/tests/models/test_cauchy.py b/tests/models/test_cauchy.py index d2d55021..5dcbfd17 100644 --- a/tests/models/test_cauchy.py +++ b/tests/models/test_cauchy.py @@ -4,11 +4,10 @@ import pytest from hypothesis import given from hypothesis import strategies as st +from mpest.models.cauchy import Cauchy from scipy import stats from scipy.stats import cauchy -from mpest.models.cauchy import Cauchy - @st.composite def valid_external_params(draw): diff --git a/tests/models/test_pareto.py b/tests/models/test_pareto.py index d8ed47ef..68dc7caf 100644 --- a/tests/models/test_pareto.py +++ b/tests/models/test_pareto.py @@ -4,9 +4,8 @@ import pytest from hypothesis import assume, given from hypothesis import strategies as st -from scipy import stats - from mpest.models.pareto import Pareto +from scipy import stats @st.composite diff --git a/tests/models/test_uniform.py b/tests/models/test_uniform.py index 653c61e9..8e215959 100644 --- a/tests/models/test_uniform.py +++ b/tests/models/test_uniform.py @@ -4,9 +4,8 @@ import pytest from hypothesis import assume, given from hypothesis import strategies as st -from scipy import stats - from mpest.models.uniform import Uniform +from scipy import stats @st.composite diff --git a/tests/test_ml_estep/test_ml.py b/tests/test_ml_estep/test_ml.py index 1a27a4e2..9df4c62c 100644 --- a/tests/test_ml_estep/test_ml.py +++ b/tests/test_ml_estep/test_ml.py @@ -2,12 +2,11 @@ import pytest from hypothesis import assume, given from hypothesis import strategies as st -from sklearn.cluster import KMeans - from mpest import Distribution, MixtureDistribution, Problem from mpest.em.methods.likelihood_method import ClusteringEStep from mpest.models import GaussianModel, WeibullModelExp from mpest.utils import ResultWithError +from sklearn.cluster import KMeans WEIBULL_PARAMS_COUNT = 2 MIN_COMPONENT_SIZE = 10 diff --git a/tests/tests_l_moments/test_any_distributions_complex_l.py b/tests/tests_l_moments/test_any_distributions_complex_l.py index 8e9514e7..f178ae06 100644 --- a/tests/tests_l_moments/test_any_distributions_complex_l.py +++ b/tests/tests_l_moments/test_any_distributions_complex_l.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from mpest import Distribution, MixtureDistribution, Problem from mpest.models import ( AModelWithGenerator, @@ -13,6 +12,7 @@ GaussianModel, WeibullModelExp, ) + from tests.tests_l_moments.l_moments_utils import run_test from tests.utils import ( check_for_params_error_tolerance, diff --git a/tests/tests_l_moments/test_any_distributions_simple_l.py b/tests/tests_l_moments/test_any_distributions_simple_l.py index e28da111..b6eefabe 100644 --- a/tests/tests_l_moments/test_any_distributions_simple_l.py +++ b/tests/tests_l_moments/test_any_distributions_simple_l.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from mpest import Distribution, MixtureDistribution, Problem from mpest.models import ( AModelWithGenerator, @@ -13,6 +12,7 @@ GaussianModel, WeibullModelExp, ) + from tests.tests_l_moments.l_moments_utils import run_test from tests.utils import check_for_params_error_tolerance diff --git a/tests/tests_l_moments/test_one_distribution_l.py b/tests/tests_l_moments/test_one_distribution_l.py index 170e55a1..44eec499 100644 --- a/tests/tests_l_moments/test_one_distribution_l.py +++ b/tests/tests_l_moments/test_one_distribution_l.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -15,6 +14,7 @@ GaussianModel, WeibullModelExp, ) + from tests.tests_l_moments.l_moments_utils import run_test from tests.utils import check_for_params_error_tolerance diff --git a/tests/tests_l_moments/test_two_same_distributions_complex_l.py b/tests/tests_l_moments/test_two_same_distributions_complex_l.py index e5965130..df900e6a 100644 --- a/tests/tests_l_moments/test_two_same_distributions_complex_l.py +++ b/tests/tests_l_moments/test_two_same_distributions_complex_l.py @@ -6,7 +6,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -17,6 +16,7 @@ WeibullModelExp, ) from mpest.utils import Factory + from tests.tests_l_moments.l_moments_utils import run_test from tests.utils import ( check_for_params_error_tolerance, diff --git a/tests/tests_l_moments/test_two_same_distributions_simple_l.py b/tests/tests_l_moments/test_two_same_distributions_simple_l.py index e3a326e9..ed6bb573 100644 --- a/tests/tests_l_moments/test_two_same_distributions_simple_l.py +++ b/tests/tests_l_moments/test_two_same_distributions_simple_l.py @@ -9,7 +9,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -20,6 +19,7 @@ WeibullModelExp, ) from mpest.utils import Factory + from tests.tests_l_moments.l_moments_utils import run_test from tests.utils import check_for_params_error_tolerance diff --git a/tests/tests_likelihood/test_any_distributions_complex.py b/tests/tests_likelihood/test_any_distributions_complex.py index 2a36ad3d..6a234f10 100644 --- a/tests/tests_likelihood/test_any_distributions_complex.py +++ b/tests/tests_likelihood/test_any_distributions_complex.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -15,6 +14,7 @@ GaussianModel, WeibullModelExp, ) + from tests.tests_likelihood.likelihood_utils import run_test from tests.utils import ( check_for_params_error_tolerance, diff --git a/tests/tests_likelihood/test_any_distributions_simple.py b/tests/tests_likelihood/test_any_distributions_simple.py index dd814768..afda08bb 100644 --- a/tests/tests_likelihood/test_any_distributions_simple.py +++ b/tests/tests_likelihood/test_any_distributions_simple.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -15,6 +14,7 @@ GaussianModel, WeibullModelExp, ) + from tests.tests_likelihood.likelihood_utils import run_test from tests.utils import check_for_params_error_tolerance diff --git a/tests/tests_likelihood/test_one_distribution.py b/tests/tests_likelihood/test_one_distribution.py index 6fbf19db..5172647d 100644 --- a/tests/tests_likelihood/test_one_distribution.py +++ b/tests/tests_likelihood/test_one_distribution.py @@ -5,7 +5,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -15,6 +14,7 @@ GaussianModel, WeibullModelExp, ) + from tests.tests_likelihood.likelihood_utils import run_test from tests.utils import check_for_params_error_tolerance diff --git a/tests/tests_likelihood/test_two_same_distributions_complex.py b/tests/tests_likelihood/test_two_same_distributions_complex.py index 8c53ff8d..29ae52d7 100644 --- a/tests/tests_likelihood/test_two_same_distributions_complex.py +++ b/tests/tests_likelihood/test_two_same_distributions_complex.py @@ -6,7 +6,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -17,6 +16,7 @@ WeibullModelExp, ) from mpest.utils import Factory + from tests.tests_likelihood.likelihood_utils import run_test from tests.utils import ( check_for_params_error_tolerance, diff --git a/tests/tests_likelihood/test_two_same_distributions_simple.py b/tests/tests_likelihood/test_two_same_distributions_simple.py index 26da7332..d2253497 100644 --- a/tests/tests_likelihood/test_two_same_distributions_simple.py +++ b/tests/tests_likelihood/test_two_same_distributions_simple.py @@ -9,7 +9,6 @@ import numpy as np import pytest - from mpest.core.distribution import Distribution from mpest.core.mixture_distribution import MixtureDistribution from mpest.core.problem import Problem @@ -20,6 +19,7 @@ WeibullModelExp, ) from mpest.utils import Factory + from tests.tests_likelihood.likelihood_utils import run_test from tests.utils import check_for_params_error_tolerance diff --git a/tests/utils.py b/tests/utils.py index 5565e6fa..ce4de0a4 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -3,7 +3,6 @@ from itertools import permutations import numpy as np - from mpest.core.mixture_distribution import MixtureDistribution from mpest.utils import ResultWithError From c35b3597a27b01b2c93a5dd10b449ced37039576 Mon Sep 17 00:00:00 2001 From: iraedeus Date: Thu, 17 Jul 2025 22:22:35 +0300 Subject: [PATCH 3/3] chore: update CONTRIBUTING.md --- CONTRIBUTING.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e069924..61f39dc5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -35,7 +35,27 @@ git checkout -b / -### 3. Make and Commit Changes +### 3. Set Up Your Development Environment + +To start working on the code, you need to install the project dependencies and set up the pre-commit hooks. These hooks automatically check your code for quality and style before each commit. + +1. **Install dependencies:** + + Follow steps in [README.md](README.md) + +2. **Install pre-commit hooks (Mandatory):** + + ```bash + pre-commit install + ``` + + This command sets up the hooks in your local Git repository. **This is a required step for all contributors.** + +Now your environment is ready. The hooks will run automatically every time you run `git commit`. + + + +### 4. Make and Commit Changes Work on the code in your new branch. When you're ready to save your changes, create a commit. We use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) to standardize commit messages. @@ -48,7 +68,7 @@ Use the following types: - `struct`: for changes related to the project structure (NOT CODE), for example, changing folder locations. - `ci`: for various CI/CD tasks. - `docs`: for changes in documentation. -- `chore`: for other changes that do not affect the code or tests (e.g., updating .gitignore, README.md). +- `chore`: for other changes that do not affect the code or tests (e.g., updating `.gitignore`, `README.md`). @@ -64,7 +84,7 @@ Try to divide commits into atomic and independent parts. That is, do not add unr -### 4. Push Changes to Your Fork +### 5. Push Changes to Your Fork After you have made one or more commits, push your branch to your remote fork on GitHub: @@ -74,13 +94,13 @@ git push -### 5. Create a Pull Request (PR) +### 6. Create a Pull Request (PR) Once your branch with the changes is in your fork, you can create a Pull Request to propose your changes to the main repository. 1. Go to your fork's page on GitHub (https://github.com/YOUR-USERNAME/pysatl-mpest). 2. You will see a notification prompting you to create a Pull Request for your recently pushed branch. Click the **"Compare & pull request"** button. -3. Ensure the base repository is PySATL/pysatl-mpest with the main branch, and the head repository is your fork and your working branch. +3. Ensure the base repository is `PySATL/pysatl-mpest` with the main branch, and the head repository is your fork and your working branch. 4. Give your Pull Request a meaningful title (following the [Conventional Commits](https://www.google.com/url?sa=E&q=https%3A%2F%2Fwww.conventionalcommits.org%2F) standard) and add a detailed description of the changes you've made. #### Rules for Your PR to be Merged