Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

feat: add math/base/special/chebyshev-t-polynomial #5774

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
anandkaranubc wants to merge 11 commits into stdlib-js:develop
base: develop
Choose a base branch
Loading
from anandkaranubc:feat/chebyshevtpoly

Conversation

Copy link
Contributor

@anandkaranubc anandkaranubc commented Mar 4, 2025
edited by kgryte
Loading

Progresses #123

Description

What is the purpose of this pull request?

This pull request:

  • Adds the JS implementation of the function to evaluate a Chebyshev polynomial of the first kind at a value x.

Related Issues

Does this pull request have any related issues?

This pull request:

Questions

Any questions for reviewers of this pull request?

No.

Other

Any other information relevant to this pull request? This may include screenshots, references, and/or implementation notes.

No.

Checklist

Please ensure the following tasks are completed before submitting this pull request.


@stdlib-js/reviewers

---
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes.
report:
 - task: lint_filenames
 status: passed
 - task: lint_editorconfig
 status: passed
 - task: lint_markdown
 status: na
 - task: lint_package_json
 status: na
 - task: lint_repl_help
 status: na
 - task: lint_javascript_src
 status: passed
 - task: lint_javascript_cli
 status: na
 - task: lint_javascript_examples
 status: na
 - task: lint_javascript_tests
 status: na
 - task: lint_javascript_benchmarks
 status: na
 - task: lint_python
 status: na
 - task: lint_r
 status: na
 - task: lint_c_src
 status: na
 - task: lint_c_examples
 status: na
 - task: lint_c_benchmarks
 status: na
 - task: lint_c_tests_fixtures
 status: na
 - task: lint_shell
 status: na
 - task: lint_typescript_declarations
 status: na
 - task: lint_typescript_tests
 status: na
 - task: lint_license_headers
 status: passed
---
---
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes.
report:
 - task: lint_filenames
 status: passed
 - task: lint_editorconfig
 status: passed
 - task: lint_markdown
 status: na
 - task: lint_package_json
 status: na
 - task: lint_repl_help
 status: na
 - task: lint_javascript_src
 status: na
 - task: lint_javascript_cli
 status: na
 - task: lint_javascript_examples
 status: na
 - task: lint_javascript_tests
 status: na
 - task: lint_javascript_benchmarks
 status: na
 - task: lint_python
 status: na
 - task: lint_r
 status: na
 - task: lint_c_src
 status: na
 - task: lint_c_examples
 status: na
 - task: lint_c_benchmarks
 status: na
 - task: lint_c_tests_fixtures
 status: na
 - task: lint_shell
 status: na
 - task: lint_typescript_declarations
 status: na
 - task: lint_typescript_tests
 status: na
 - task: lint_license_headers
 status: passed
---
---
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes.
report:
 - task: lint_filenames
 status: passed
 - task: lint_editorconfig
 status: passed
 - task: lint_markdown
 status: na
 - task: lint_package_json
 status: na
 - task: lint_repl_help
 status: na
 - task: lint_javascript_src
 status: na
 - task: lint_javascript_cli
 status: na
 - task: lint_javascript_examples
 status: na
 - task: lint_javascript_tests
 status: passed
 - task: lint_javascript_benchmarks
 status: na
 - task: lint_python
 status: passed
 - task: lint_r
 status: na
 - task: lint_c_src
 status: na
 - task: lint_c_examples
 status: na
 - task: lint_c_benchmarks
 status: na
 - task: lint_c_tests_fixtures
 status: na
 - task: lint_shell
 status: na
 - task: lint_typescript_declarations
 status: na
 - task: lint_typescript_tests
 status: na
 - task: lint_license_headers
 status: passed
---
---
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes.
report:
 - task: lint_filenames
 status: passed
 - task: lint_editorconfig
 status: passed
 - task: lint_markdown
 status: passed
 - task: lint_package_json
 status: passed
 - task: lint_repl_help
 status: passed
 - task: lint_javascript_src
 status: na
 - task: lint_javascript_cli
 status: na
 - task: lint_javascript_examples
 status: passed
 - task: lint_javascript_tests
 status: na
 - task: lint_javascript_benchmarks
 status: passed
 - task: lint_python
 status: na
 - task: lint_r
 status: na
 - task: lint_c_src
 status: na
 - task: lint_c_examples
 status: na
 - task: lint_c_benchmarks
 status: na
 - task: lint_c_tests_fixtures
 status: na
 - task: lint_shell
 status: na
 - task: lint_typescript_declarations
 status: passed
 - task: lint_typescript_tests
 status: passed
 - task: lint_license_headers
 status: passed
---
---
type: pre_push_report
description: Results of running various checks prior to pushing changes.
report:
 - task: run_javascript_examples
 status: na
 - task: run_c_examples
 status: na
 - task: run_cpp_examples
 status: na
 - task: run_javascript_readme_examples
 status: na
 - task: run_c_benchmarks
 status: na
 - task: run_cpp_benchmarks
 status: na
 - task: run_fortran_benchmarks
 status: na
 - task: run_javascript_benchmarks
 status: na
 - task: run_julia_benchmarks
 status: na
 - task: run_python_benchmarks
 status: na
 - task: run_r_benchmarks
 status: na
 - task: run_javascript_tests
 status: na
---
@stdlib-bot stdlib-bot added Math Issue or pull request specific to math functionality. Needs Review A pull request which needs code review. labels Mar 4, 2025
Copy link
Contributor Author

/stdlib update-copyright-years

stdlib-bot reacted with eyes emoji

@stdlib-bot stdlib-bot added the bot: In Progress Pull request is currently awaiting automation. label Mar 4, 2025
Copy link
Contributor

stdlib-bot commented Mar 4, 2025
edited
Loading

Coverage Report

Package Statements Branches Functions Lines
math/base/special/chebyshev-t-polynomial $\color{green}137/137$
$\color{green}+100.00\%$
$\color{green}7/7$
$\color{green}+100.00\%$
$\color{green}1/1$
$\color{green}+100.00\%$
$\color{green}137/137$
$\color{green}+100.00\%$

The above coverage report was generated for the changes in this PR.

@stdlib-bot stdlib-bot removed the bot: In Progress Pull request is currently awaiting automation. label Mar 4, 2025
Copy link
Contributor Author

anandkaranubc commented Mar 4, 2025
edited
Loading

Time to bring hyp2f1 to life! 🚀

Once this is approved, I will also add its respective C implementation. 😄

delta = abs( y - expected[ i ] );

// NOTE: The tolerance is higher due to the numerical differences between the `hyp2f1` implementation in JavaScript and its reference implementation in SciPy.
tol = 755.0 * EPS * abs( expected[ i ] );
Copy link
Contributor Author

@anandkaranubc anandkaranubc Mar 4, 2025

Choose a reason for hiding this comment

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

I expected this from the start. Fortunately, they are not as crazy as hyp2f1. The test coverage report also confirms that this function only uses parts of the helper functions hyp2f1ra and hys2f1 that rely on evaluating the hypergeometric function through power series expansion. Thus, numerical differences...

kgryte reacted with thumbs up emoji

def main():
"""Generate fixture data."""
x = np.linspace(-1, 1, 1000)
Copy link
Contributor Author

@anandkaranubc anandkaranubc Mar 4, 2025

Choose a reason for hiding this comment

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

In the text fixture generation, I have kept x in the [-1,1] range, where these polynomials are typically considered. Is it also necessary to test outside of this interval?

For |x| > 1, the polynomials grow exponentially rather than oscillating. Our implementation can handle that since there is no restriction on x.

Copy link
Member

Choose a reason for hiding this comment

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

I'm fine leaving it in [-1,1] is that is the typical range.

) {
return NaN;
}
return hyp2f1( -n, n, 0.5, 0.5*(1-x) );
Copy link
Contributor Author

@anandkaranubc anandkaranubc Mar 4, 2025

Choose a reason for hiding this comment

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

No restrictions on x over here :)

kgryte reacted with thumbs up emoji
anandkaranubc and others added 3 commits March 3, 2025 21:38
Signed-off-by: Karan Anand <119553199+anandkaranubc@users.noreply.github.com>
---
type: pre_commit_static_analysis_report
description: Results of running static analysis checks when committing changes.
report:
 - task: lint_filenames
 status: passed
 - task: lint_editorconfig
 status: passed
 - task: lint_markdown
 status: passed
 - task: lint_package_json
 status: passed
 - task: lint_repl_help
 status: na
 - task: lint_javascript_src
 status: passed
 - task: lint_javascript_cli
 status: na
 - task: lint_javascript_examples
 status: na
 - task: lint_javascript_tests
 status: na
 - task: lint_javascript_benchmarks
 status: na
 - task: lint_python
 status: na
 - task: lint_r
 status: na
 - task: lint_c_src
 status: na
 - task: lint_c_examples
 status: na
 - task: lint_c_benchmarks
 status: na
 - task: lint_c_tests_fixtures
 status: na
 - task: lint_shell
 status: na
 - task: lint_typescript_declarations
 status: na
 - task: lint_typescript_tests
 status: na
 - task: lint_license_headers
 status: passed
---
---
type: pre_push_report
description: Results of running various checks prior to pushing changes.
report:
 - task: run_javascript_examples
 status: na
 - task: run_c_examples
 status: na
 - task: run_cpp_examples
 status: na
 - task: run_javascript_readme_examples
 status: passed
 - task: run_c_benchmarks
 status: na
 - task: run_cpp_benchmarks
 status: na
 - task: run_fortran_benchmarks
 status: na
 - task: run_javascript_benchmarks
 status: na
 - task: run_julia_benchmarks
 status: na
 - task: run_python_benchmarks
 status: na
 - task: run_r_benchmarks
 status: na
 - task: run_javascript_tests
 status: na
---
@anandkaranubc anandkaranubc added the JavaScript Issue involves or relates to JavaScript. label Mar 4, 2025
anandkaranubc and others added 2 commits April 1, 2025 22:58
Co-authored-by: Karan Anand <119553199+anandkaranubc@users.noreply.github.com>
Signed-off-by: Athan <kgryte@gmail.com>

# chebyshevtpoly

> [Chebyshev Polynomial][chebyshev-polynomial] of the first kind.
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
> [Chebyshev Polynomial][chebyshev-polynomial] of the first kind.
> [Chebyshev polynomial][chebyshev-polynomial] of the first kind.

"polynomial" does not need to be capitalized. Applies here and elsewhere throughout this package.


where `n` is the polynomial degree.

The [Chebyshev Polynomial][chebyshev-polynomial] of the first kind is related to the Gaussian hypergeometric function via the following equation
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
The [Chebyshev Polynomial][chebyshev-polynomial] of the first kind is related to the Gaussian hypergeometric function via the following equation
The [Chebyshev Polynomial][chebyshev-polynomial] of the first kind is related to the [Gaussian hypergeometric function][@stdlib/math/base/special/hyp2f1] via the following equation

You'll need to add the link defn below in the links section. Also double-check that I used the correct package name.

// returns NaN
```

If provided a polynomial degree `n` which is not a nonnegative integer, the function returns `NaN`.
Copy link
Member

Choose a reason for hiding this comment

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

Why do we restrict to only integer degrees? Why not follow SciPy and state that non-integer values are resolved relative to the hypergeometric function?

<!-- eslint no-undef: "error" -->

```javascript
var randu = require( '@stdlib/random/base/randu' );
Copy link
Member

Choose a reason for hiding this comment

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

We can update this example to use console/log-each-map.


<section class="links">

[chebyshev-polynomial]: https://en.wikipedia.org/wiki/Chebyshev_polynomials#Definitions
Copy link
Member

Choose a reason for hiding this comment

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

You can drop #Definitions here.

@@ -0,0 +1,38 @@

{{alias}}( n, x )
Evaluates the Chebyshev polynomial of the first kind
Copy link
Member

Choose a reason for hiding this comment

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

Your line wrapping is off here.

'use strict';

var randu = require( '@stdlib/random/base/randu' );
var round = require( '@stdlib/math/base/special/round' );
Copy link
Member

Choose a reason for hiding this comment

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

Same comment as README.

function chebyshevtpoly( n, x ) {
if (
isnan( x ) ||
!isInteger( n ) ||
Copy link
Member

Choose a reason for hiding this comment

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

Not clear to me that we need to apply this restriction.

) {
return NaN;
}
return hyp2f1( -n, n, 0.5, 0.5*(1.0-x) );
Copy link
Member

Choose a reason for hiding this comment

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

For integer x, why not use the recurrence relation directly, as in SciPy?

{
"name": "@stdlib/math/base/special/chebyshev-t-polynomial",
"version": "0.0.0",
"description": "Evaluates the Chebyshev polynomial of the first kind.",
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
"description": "Evaluates the Chebyshev polynomial of the first kind.",
"description": "Evaluate the Chebyshev polynomial of the first kind.",

Copy link
Member

@kgryte kgryte left a comment

Choose a reason for hiding this comment

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

Left an initial round of comments.

@kgryte kgryte added Needs Changes Pull request which needs changes before being merged. and removed Needs Review A pull request which needs code review. labels Apr 2, 2025
@anandkaranubc anandkaranubc marked this pull request as draft April 11, 2025 07:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Reviewers

@kgryte kgryte kgryte requested changes

Requested changes must be addressed to merge this pull request.

Assignees
No one assigned
Labels
JavaScript Issue involves or relates to JavaScript. Math Issue or pull request specific to math functionality. Needs Changes Pull request which needs changes before being merged.
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /