{"action":"closed","number":235,"pull_request":{"url":"https://api.github.com/repos/PyAbel/PyAbel/pulls/235","id":227823853,"node_id":"MDExOlB1bGxSZXF1ZXN0MjI3ODIzODUz","html_url":"https://github.com/PyAbel/PyAbel/pull/235","diff_url":"https://github.com/PyAbel/PyAbel/pull/235.diff","patch_url":"https://github.com/PyAbel/PyAbel/pull/235.patch","issue_url":"https://api.github.com/repos/PyAbel/PyAbel/issues/235","number":235,"state":"closed","locked":false,"title":"BASEX improvements","user":{"login":"MikhailRyazanov","id":12854133,"node_id":"MDQ6VXNlcjEyODU0MTMz","avatar_url":"https://avatars1.githubusercontent.com/u/12854133?v=4","gravatar_id":"","url":"https://api.github.com/users/MikhailRyazanov","html_url":"https://github.com/MikhailRyazanov","followers_url":"https://api.github.com/users/MikhailRyazanov/followers","following_url":"https://api.github.com/users/MikhailRyazanov/following{/other_user}","gists_url":"https://api.github.com/users/MikhailRyazanov/gists{/gist_id}","starred_url":"https://api.github.com/users/MikhailRyazanov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikhailRyazanov/subscriptions","organizations_url":"https://api.github.com/users/MikhailRyazanov/orgs","repos_url":"https://api.github.com/users/MikhailRyazanov/repos","events_url":"https://api.github.com/users/MikhailRyazanov/events{/privacy}","received_events_url":"https://api.github.com/users/MikhailRyazanov/received_events","type":"User","site_admin":false},"body":"This addresses all issues in #230 and finalizes #226.\r\n\r\n## Main changes\r\n\r\nThe basis-generation code (`_bs_basex()`) is rewritten almost completely.\r\n- Now it works with arbitrary width parameters _σ_ and accepts `n, sigma` instead of `n, nbf`. `sigma` is actually used everywhere, since it is more fundamental than `nbf` (which is `n` / `sigma`).\r\n- The computations became is >10 times faster:\r\n   - All the needed Γ-function values are precomputed, which takes _O_(_n_<sup>2</sup>) extra space (~the same as for the basis matrices), but avoids recomputing them _O_(_n_<sup>3</sup>) times.\r\n   - The summation cutoff is tightened very close to the limit for \"numerically exact\" results (floating-point precision).\r\n- It can take previously computed smaller basis matrices for the same _σ_ and extend them by computing only the missing (outer) elements.\r\n\r\nThe `get_bs_cached()` code (renamed from `get_bs_basex_cached()` for consistency) is changed accordingly.\r\n- The file-naming scheme is changed to `basex_basis_{n}_{sigma}.npy`.\r\n- Attempts to get the basis (if not already in memory) are tried in the following order:\r\n   1. If the file for given `n`, `sigma` exists, then it is used.\r\n   2. If files for larger `n` and the same `sigma` exist, then the smallest of them is loaded and cropped.\r\n   3. If files for smaller `n` and the same `sigma` exist, then the largest of them is loaded and extended by `_bs_basex()`.\r\n   4. If nothing helps, then a completely new basis is generated.\r\n\r\nThe `MAGIC_NUMBER` intensity correction is replaced by `get_basex_correction()`, activated by passing `correction=True` to `basex_transform()` (or `get_bs_cached()`). See #230 for details.\r\n\r\nA new module `abel.tools.polynomial` is added (primarily for `get_basex_correction()`), which implements the analytical Abel transform for arbitrary polynomials. `Polynomial` and `PiecewisePolynomial` are added to `abel.tools.analytical`.\r\n\r\nTest are added/updated for `abel.basex` and `abel.tools.polynomial`.\r\n\r\n## Additional changes\r\n\r\nDeclared `_source` as `global` in `dash.cache_cleanup()` (amending #232).\r\n\r\nMinor corrections to documentation.\r\nIn particular, `abel.tools.analytical` docstrings are moved from `__init__()` to class levels, since they were not visible in the generated documentation.\r\n\r\n## Questions\r\n\r\nWhat is `mask_valid` in `BaseAnalytical` and how to set it meaningfully for polynomials?\r\n\r\nWhat happened to the `GaussianAnalytical` docstring (the [`ratio_valid_sigma` description](https://github.com/PyAbel/PyAbel/blob/be2d1adb1b20a664ac6f757d1c40fb737222ba63/abel/tools/analytical.py#L187-L190))?\r\n\r\nThe are some problems with multiple parameters in docstrings, for example, see [`abel.tools.polar.cart2polar`](https://pyabel.readthedocs.io/en/latest/abel.html#abel.tools.polar.cart2polar) — `x, y : floats or arrays` is rendered as \"**y** (_x,_)\".\r\nThis is probably related to https://github.com/sphinx-doc/sphinx/issues/2227?\r\n\r\nPerhaps, `linbasex.basis_cache_cleanup()` should be renamed to `linbasex.cache_cleanup()` for consistency with and `dasch.cache_cleanup()` `basex.cache_cleanup()`?","created_at":"2018-11-02T03:49:05Z","updated_at":"2018-11-20T23:52:46Z","closed_at":"2018-11-20T23:52:46Z","merged_at":"2018-11-20T23:52:46Z","merge_commit_sha":"fe79c8988977df4bea124ab05628cfb49dcd5f8b","assignee":null,"assignees":[],"requested_reviewers":[{"login":"rth","id":630936,"node_id":"MDQ6VXNlcjYzMDkzNg==","avatar_url":"https://avatars0.githubusercontent.com/u/630936?v=4","gravatar_id":"","url":"https://api.github.com/users/rth","html_url":"https://github.com/rth","followers_url":"https://api.github.com/users/rth/followers","following_url":"https://api.github.com/users/rth/following{/other_user}","gists_url":"https://api.github.com/users/rth/gists{/gist_id}","starred_url":"https://api.github.com/users/rth/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rth/subscriptions","organizations_url":"https://api.github.com/users/rth/orgs","repos_url":"https://api.github.com/users/rth/repos","events_url":"https://api.github.com/users/rth/events{/privacy}","received_events_url":"https://api.github.com/users/rth/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/PyAbel/PyAbel/pulls/235/commits","review_comments_url":"https://api.github.com/repos/PyAbel/PyAbel/pulls/235/comments","review_comment_url":"https://api.github.com/repos/PyAbel/PyAbel/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PyAbel/PyAbel/issues/235/comments","statuses_url":"https://api.github.com/repos/PyAbel/PyAbel/statuses/8eba7a39f350e5818ae2fe14dd30de343e200d00","head":{"label":"MikhailRyazanov:master","ref":"master","sha":"8eba7a39f350e5818ae2fe14dd30de343e200d00","user":{"login":"MikhailRyazanov","id":12854133,"node_id":"MDQ6VXNlcjEyODU0MTMz","avatar_url":"https://avatars1.githubusercontent.com/u/12854133?v=4","gravatar_id":"","url":"https://api.github.com/users/MikhailRyazanov","html_url":"https://github.com/MikhailRyazanov","followers_url":"https://api.github.com/users/MikhailRyazanov/followers","following_url":"https://api.github.com/users/MikhailRyazanov/following{/other_user}","gists_url":"https://api.github.com/users/MikhailRyazanov/gists{/gist_id}","starred_url":"https://api.github.com/users/MikhailRyazanov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikhailRyazanov/subscriptions","organizations_url":"https://api.github.com/users/MikhailRyazanov/orgs","repos_url":"https://api.github.com/users/MikhailRyazanov/repos","events_url":"https://api.github.com/users/MikhailRyazanov/events{/privacy}","received_events_url":"https://api.github.com/users/MikhailRyazanov/received_events","type":"User","site_admin":false},"repo":{"id":147987630,"node_id":"MDEwOlJlcG9zaXRvcnkxNDc5ODc2MzA=","name":"PyAbel","full_name":"MikhailRyazanov/PyAbel","private":false,"owner":{"login":"MikhailRyazanov","id":12854133,"node_id":"MDQ6VXNlcjEyODU0MTMz","avatar_url":"https://avatars1.githubusercontent.com/u/12854133?v=4","gravatar_id":"","url":"https://api.github.com/users/MikhailRyazanov","html_url":"https://github.com/MikhailRyazanov","followers_url":"https://api.github.com/users/MikhailRyazanov/followers","following_url":"https://api.github.com/users/MikhailRyazanov/following{/other_user}","gists_url":"https://api.github.com/users/MikhailRyazanov/gists{/gist_id}","starred_url":"https://api.github.com/users/MikhailRyazanov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikhailRyazanov/subscriptions","organizations_url":"https://api.github.com/users/MikhailRyazanov/orgs","repos_url":"https://api.github.com/users/MikhailRyazanov/repos","events_url":"https://api.github.com/users/MikhailRyazanov/events{/privacy}","received_events_url":"https://api.github.com/users/MikhailRyazanov/received_events","type":"User","site_admin":false},"html_url":"https://github.com/MikhailRyazanov/PyAbel","description":"A python package for Abel and inverse Abel transforms","fork":true,"url":"https://api.github.com/repos/MikhailRyazanov/PyAbel","forks_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/forks","keys_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/teams","hooks_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/hooks","issue_events_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/issues/events{/number}","events_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/events","assignees_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/assignees{/user}","branches_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/branches{/branch}","tags_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/tags","blobs_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/git/refs{/sha}","trees_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/statuses/{sha}","languages_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/languages","stargazers_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/stargazers","contributors_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/contributors","subscribers_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/subscribers","subscription_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/subscription","commits_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/commits{/sha}","git_commits_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/git/commits{/sha}","comments_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/comments{/number}","issue_comment_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/issues/comments{/number}","contents_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/contents/{+path}","compare_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/merges","archive_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/downloads","issues_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/issues{/number}","pulls_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/pulls{/number}","milestones_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/milestones{/number}","notifications_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/labels{/name}","releases_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/releases{/id}","deployments_url":"https://api.github.com/repos/MikhailRyazanov/PyAbel/deployments","created_at":"2018-09-09T02:47:57Z","updated_at":"2018-11-13T03:46:39Z","pushed_at":"2018-11-20T23:49:08Z","git_url":"git://github.com/MikhailRyazanov/PyAbel.git","ssh_url":"git@github.com:MikhailRyazanov/PyAbel.git","clone_url":"https://github.com/MikhailRyazanov/PyAbel.git","svn_url":"https://github.com/MikhailRyazanov/PyAbel","homepage":"","size":21088,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"PyAbel:master","ref":"master","sha":"be2d1adb1b20a664ac6f757d1c40fb737222ba63","user":{"login":"PyAbel","id":15894666,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1ODk0NjY2","avatar_url":"https://avatars3.githubusercontent.com/u/15894666?v=4","gravatar_id":"","url":"https://api.github.com/users/PyAbel","html_url":"https://github.com/PyAbel","followers_url":"https://api.github.com/users/PyAbel/followers","following_url":"https://api.github.com/users/PyAbel/following{/other_user}","gists_url":"https://api.github.com/users/PyAbel/gists{/gist_id}","starred_url":"https://api.github.com/users/PyAbel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PyAbel/subscriptions","organizations_url":"https://api.github.com/users/PyAbel/orgs","repos_url":"https://api.github.com/users/PyAbel/repos","events_url":"https://api.github.com/users/PyAbel/events{/privacy}","received_events_url":"https://api.github.com/users/PyAbel/received_events","type":"Organization","site_admin":false},"repo":{"id":30170345,"node_id":"MDEwOlJlcG9zaXRvcnkzMDE3MDM0NQ==","name":"PyAbel","full_name":"PyAbel/PyAbel","private":false,"owner":{"login":"PyAbel","id":15894666,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE1ODk0NjY2","avatar_url":"https://avatars3.githubusercontent.com/u/15894666?v=4","gravatar_id":"","url":"https://api.github.com/users/PyAbel","html_url":"https://github.com/PyAbel","followers_url":"https://api.github.com/users/PyAbel/followers","following_url":"https://api.github.com/users/PyAbel/following{/other_user}","gists_url":"https://api.github.com/users/PyAbel/gists{/gist_id}","starred_url":"https://api.github.com/users/PyAbel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PyAbel/subscriptions","organizations_url":"https://api.github.com/users/PyAbel/orgs","repos_url":"https://api.github.com/users/PyAbel/repos","events_url":"https://api.github.com/users/PyAbel/events{/privacy}","received_events_url":"https://api.github.com/users/PyAbel/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/PyAbel/PyAbel","description":"A python package for Abel and inverse Abel transforms","fork":false,"url":"https://api.github.com/repos/PyAbel/PyAbel","forks_url":"https://api.github.com/repos/PyAbel/PyAbel/forks","keys_url":"https://api.github.com/repos/PyAbel/PyAbel/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PyAbel/PyAbel/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PyAbel/PyAbel/teams","hooks_url":"https://api.github.com/repos/PyAbel/PyAbel/hooks","issue_events_url":"https://api.github.com/repos/PyAbel/PyAbel/issues/events{/number}","events_url":"https://api.github.com/repos/PyAbel/PyAbel/events","assignees_url":"https://api.github.com/repos/PyAbel/PyAbel/assignees{/user}","branches_url":"https://api.github.com/repos/PyAbel/PyAbel/branches{/branch}","tags_url":"https://api.github.com/repos/PyAbel/PyAbel/tags","blobs_url":"https://api.github.com/repos/PyAbel/PyAbel/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PyAbel/PyAbel/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PyAbel/PyAbel/git/refs{/sha}","trees_url":"https://api.github.com/repos/PyAbel/PyAbel/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PyAbel/PyAbel/statuses/{sha}","languages_url":"https://api.github.com/repos/PyAbel/PyAbel/languages","stargazers_url":"https://api.github.com/repos/PyAbel/PyAbel/stargazers","contributors_url":"https://api.github.com/repos/PyAbel/PyAbel/contributors","subscribers_url":"https://api.github.com/repos/PyAbel/PyAbel/subscribers","subscription_url":"https://api.github.com/repos/PyAbel/PyAbel/subscription","commits_url":"https://api.github.com/repos/PyAbel/PyAbel/commits{/sha}","git_commits_url":"https://api.github.com/repos/PyAbel/PyAbel/git/commits{/sha}","comments_url":"https://api.github.com/repos/PyAbel/PyAbel/comments{/number}","issue_comment_url":"https://api.github.com/repos/PyAbel/PyAbel/issues/comments{/number}","contents_url":"https://api.github.com/repos/PyAbel/PyAbel/contents/{+path}","compare_url":"https://api.github.com/repos/PyAbel/PyAbel/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PyAbel/PyAbel/merges","archive_url":"https://api.github.com/repos/PyAbel/PyAbel/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PyAbel/PyAbel/downloads","issues_url":"https://api.github.com/repos/PyAbel/PyAbel/issues{/number}","pulls_url":"https://api.github.com/repos/PyAbel/PyAbel/pulls{/number}","milestones_url":"https://api.github.com/repos/PyAbel/PyAbel/milestones{/number}","notifications_url":"https://api.github.com/repos/PyAbel/PyAbel/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PyAbel/PyAbel/labels{/name}","releases_url":"https://api.github.com/repos/PyAbel/PyAbel/releases{/id}","deployments_url":"https://api.github.com/repos/PyAbel/PyAbel/deployments","created_at":"2015-02-02T03:59:28Z","updated_at":"2018-11-01T15:14:05Z","pushed_at":"2018-11-20T23:52:46Z","git_url":"git://github.com/PyAbel/PyAbel.git","ssh_url":"git@github.com:PyAbel/PyAbel.git","clone_url":"https://github.com/PyAbel/PyAbel.git","svn_url":"https://github.com/PyAbel/PyAbel","homepage":"","size":20980,"stargazers_count":28,"watchers_count":28,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":15,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":18,"open_issues":15,"watchers":28,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PyAbel/PyAbel/pulls/235"},"html":{"href":"https://github.com/PyAbel/PyAbel/pull/235"},"issue":{"href":"https://api.github.com/repos/PyAbel/PyAbel/issues/235"},"comments":{"href":"https://api.github.com/repos/PyAbel/PyAbel/issues/235/comments"},"review_comments":{"href":"https://api.github.com/repos/PyAbel/PyAbel/pulls/235/comments"},"review_comment":{"href":"https://api.github.com/repos/PyAbel/PyAbel/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PyAbel/PyAbel/pulls/235/commits"},"statuses":{"href":"https://api.github.com/repos/PyAbel/PyAbel/statuses/8eba7a39f350e5818ae2fe14dd30de343e200d00"}},"author_association":"CONTRIBUTOR","merged":true,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":{"login":"MikhailRyazanov","id":12854133,"node_id":"MDQ6VXNlcjEyODU0MTMz","avatar_url":"https://avatars1.githubusercontent.com/u/12854133?v=4","gravatar_id":"","url":"https://api.github.com/users/MikhailRyazanov","html_url":"https://github.com/MikhailRyazanov","followers_url":"https://api.github.com/users/MikhailRyazanov/followers","following_url":"https://api.github.com/users/MikhailRyazanov/following{/other_user}","gists_url":"https://api.github.com/users/MikhailRyazanov/gists{/gist_id}","starred_url":"https://api.github.com/users/MikhailRyazanov/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikhailRyazanov/subscriptions","organizations_url":"https://api.github.com/users/MikhailRyazanov/orgs","repos_url":"https://api.github.com/users/MikhailRyazanov/repos","events_url":"https://api.github.com/users/MikhailRyazanov/events{/privacy}","received_events_url":"https://api.github.com/users/MikhailRyazanov/received_events","type":"User","site_admin":false},"comments":23,"review_comments":6,"maintainer_can_modify":false,"commits":43,"additions":1003,"deletions":282,"changed_files":12}}
{"actor":{"display_login":"MikhailRyazanov"}}