Skip to content

[docs] Add a prototype estimator for array api enabling #2534

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

icfaust
Copy link
Contributor

@icfaust icfaust commented Jun 11, 2025

Description

First start by generating code which represents the basic requirements of a sklearnex and onedal estimator.

This PR serves two purposes: to ease understanding of the codebase for external development and standardize development
occurring for array API support.

Next will be to make the necessary doc page links to various aspects to act as a guide for array API development. Which will help in external user contribution.

My goal will be to see if I can get an LLM with this information to generate StandardScaler using BasicStatistics. If it can, that means an LLM can help guide a user with this starting prompt in more difficult scenarios.


PR should start as a draft, then move to ready for review state after CI is passed and all applicable checkboxes are closed.
This approach ensures that reviewers don't spend extra time asking for regular requirements.

You can remove a checkbox as not applicable only if it doesn't relate to this PR in any way.
For example, PR with docs update doesn't require checkboxes for performance while PR with any change in actual code should have checkboxes and justify how this code change is expected to affect performance (or justification should be self-evident).

Checklist to comply with before moving PR from draft:

PR completeness and readability

  • I have reviewed my changes thoroughly before submitting this pull request.
  • I have commented my code, particularly in hard-to-understand areas.
  • I have updated the documentation to reflect the changes or created a separate PR with update and provided its number in the description, if necessary.
  • Git commit message contains an appropriate signed-off-by string (see CONTRIBUTING.md for details).
  • I have added a respective label(s) to PR if I have a permission for that.
  • I have resolved any merge conflicts that might occur with the base branch.

Testing

  • I have run it locally and tested the changes extensively.
  • All CI jobs are green or I have provided justification why they aren't.
  • I have extended testing suite if new functionality was introduced in this PR.

Performance

  • I have measured performance for affected algorithms using scikit-learn_bench and provided at least summary table with measured data, if performance change is expected.
  • I have provided justification why performance has changed or why changes are not expected.
  • I have provided justification why quality metrics have changed or why changes are not expected.
  • I have extended benchmarking suite and provided corresponding scikit-learn_bench PR if new measurable functionality was introduced in this PR.

Copy link

codecov bot commented Jun 11, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Flag Coverage Δ
azure ?
github 71.62% <ø> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
sklearnex/basic_statistics/basic_statistics.py 89.70% <ø> (-0.15%) ⬇️

... and 46 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

#
# 1) All sklearnex estimators must inherit oneDALestimator and the sklearn
# estimator that it is replicating (i.e. before in the mro). If there is
# not an equivalent sklearn estimator, then sklearn's BaseEstimator must be
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should also inherit from the corresponding type for what the estimator does, like RegressorMixin.

# inherited.
#
# 2) ``check_is_fitted`` is required for any method in an estimator which
# requires first calling ``fit`` or ``partial_fit``. This is a sklearn
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's actually not a requirement to call this specific sklearn function within .fit, only to make the estimator work correctly when that function is called on it:
https://scikit-learn.org/stable/developers/develop.html#developer-api-for-check-is-fitted

#
# Sklearnex estimator methods can be thought of in 3 major tiers.
#
# Tier 1: Those methods which offload to oneDAL using ``dispatch``. Typical
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# Tier 1: Those methods which offload to oneDAL using ``dispatch``. Typical
# Tier 1: Methods which offload to oneDAL using ``dispatch``. Typical

Comment on lines +95 to +96
# examples are ``fit`` and ``predict``. They use a direct equivalent oneDAL
# function for evaluation. These methods are of highest priority and have
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# examples are ``fit`` and ``predict``. They use a direct equivalent oneDAL
# function for evaluation. These methods are of highest priority and have
# examples are ``fit`` and ``predict``. They use a direct equivalent function
# from oneDAL. These methods are of highest priority and have

# sklearn, giving the ability to use raw data directly and avoiding
# sklearn pre-processing checks as necessary.
#
# 3) Pybind11 interfaces should be not be made public to the user unless
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
# 3) Pybind11 interfaces should be not be made public to the user unless
# 3) Pybind11 interfaces should not be be made public to the user unless

# 4) Either sklearn is called, or a object from onedal is created and called
# using the input data. This process is handled in a function which has the
# prefix "_onedal_" followed by the method name. When fitting data, the
# returned onedal estimator object is stored as the ``_onedal_estimator``
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How should serialization work for such objects? Should it all happen in PyBind11?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the heads up on that. It is yet to be addressed in the equivalent onedal/tests/prototype.py file, and will be guaranteed to exist when PR is moved from draft.

# 3) ``_onedal_gpu_supported`` or ``_onedal_cpu_supported`` creates a
# PatchingConditionsChain object, takes the input data and estimator
# parameters, and evaluates whether the estimator and data can be run using
# oneDAL. This information is logged to the `sklearnex` logger.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logger is not imported in this example.



################
# IMPORT NOTES #
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing the requirement that estimators based off existing sklearn classes should add entries to the support table in the docs when added.

# are ``score`` and ``predict_log_proba``. Oftentimes the additional
# calculations are trivial, meaning benchmarking is not required.
#
# Tier 3: Those methods which directly use sklearn functionality. Typically
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing the mechanism that we're using to inherit docstrings.


def fit(self, X, y):
#
pass
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one should always return 'self'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants