From d5a5bc58d753d5f51eaf5d4a38eb394e74e541c9 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 2 Mar 2023 22:59:16 +0000 Subject: [PATCH 01/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e3f6422..b4b4747 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take": "^0.0.1", "@stdlib/array-base-zero-to": "^0.0.6", "@stdlib/ndarray-base-strides2order": "^0.0.6", - "@stdlib/types": "^0.0.14" + "@stdlib/types": "^0.0.14", + "@stdlib/error-tools-fmtprodmsg": "^0.0.2" }, "devDependencies": { "@stdlib/assert-is-array": "^0.0.7", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From 1809c99d8b8d0f16fd45da9d52b7b704215264a0 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 2 Mar 2023 23:01:18 +0000 Subject: [PATCH 02/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 62 - .github/workflows/cancel.yml | 56 - .github/workflows/close_pull_requests.yml | 44 - .github/workflows/examples.yml | 62 - .github/workflows/npm_downloads.yml | 108 - .github/workflows/productionize.yml | 798 --- .github/workflows/publish.yml | 236 - .github/workflows/test.yml | 97 - .github/workflows/test_bundles.yml | 180 - .github/workflows/test_coverage.yml | 123 - .github/workflows/test_install.yml | 83 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/test.js | 142 - 37 files changed, 6201 insertions(+), 3928 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 0fd4d6c..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 06a9a75..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,62 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index a00dbe5..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,56 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - uses: styfle/cancel-workflow-action@0.11.0 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index a2260ee..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,44 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - run: - runs-on: ubuntu-latest - steps: - - uses: superbrothers/close-pull-request@v3 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 7902a7d..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,62 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout the repository' - uses: actions/checkout@v3 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 395879d..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,108 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - uses: actions/upload-artifact@v3 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - uses: distributhor/workflow-webhook@v3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 3e8e2db..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,798 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - uses: actions/checkout@v3 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Format error messages: - - name: 'Replace double quotes with single quotes in rewritten format string error messages' - run: | - find . -name "*.js" -exec sed -E -i "s/Error\( format\( \"([a-zA-Z0-9]+)\"/Error\( format\( '\1'/g" {} \; - - # Format string literal error messages: - - name: 'Replace double quotes with single quotes in rewritten string literal error messages' - run: | - find . -name "*.js" -exec sed -E -i "s/Error\( format\(\"([a-zA-Z0-9]+)\"\)/Error\( format\( '\1' \)/g" {} \; - - # Format code: - - name: 'Replace double quotes with single quotes in inserted `require` calls' - run: | - find . -name "*.js" -exec sed -E -i "s/require\( ?\"@stdlib\/error-tools-fmtprodmsg\" ?\);/require\( '@stdlib\/error-tools-fmtprodmsg' \);/g" {} \; - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/checkout@v3 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v1 - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -164,7 +157,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -228,7 +221,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index 08e85d5..95eea2b 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 2.0 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..da509d8 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.0.6-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.0.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,b,g,v,c;if(l=s(d.length),p=i(n),b=i(a),g=i(o),(m=t([],4))[p].push(n),m[b].push(a),m[g].push(o),3===(h=m[0].length))j=n;else if(2===h){for(v=1;v<4;v++)if(m[v].length){j=m[v][0];break}}else{for(c=0,v=1;v<4;v++)(f=m[v].length)>=h&&(h=f,c=v);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..d73d41c --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;qcA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index b4b4747..fb67029 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.0.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.0.1", - "@stdlib/array-base-filled": "^0.0.2", - "@stdlib/array-base-take": "^0.0.1", - "@stdlib/array-base-zero-to": "^0.0.6", - "@stdlib/ndarray-base-strides2order": "^0.0.6", - "@stdlib/types": "^0.0.14", - "@stdlib/error-tools-fmtprodmsg": "^0.0.2" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.0.7", - "@stdlib/bench": "^0.0.12", - "@stdlib/ndarray-array": "^0.0.9", - "@stdlib/ndarray-base-shape2strides": "^0.0.8", - "@stdlib/random-base-randu": "^0.0.8", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..f2a26d4 --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From df271680536d9fe8094f8dbba37d6b7d8b5841eb Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 3 Mar 2023 16:44:07 +0000 Subject: [PATCH 03/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a50a2b5..564b089 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take": "^0.0.1", "@stdlib/array-base-zero-to": "^0.0.6", "@stdlib/ndarray-base-strides2order": "^0.0.6", - "@stdlib/types": "^0.0.14" + "@stdlib/types": "^0.0.14", + "@stdlib/error-tools-fmtprodmsg": "^0.0.2" }, "devDependencies": { "@stdlib/assert-is-array": "^0.0.7", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From 5fe6859dbfeafe1dfa3beb4afad47c3f2ff74dfb Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 3 Mar 2023 16:44:34 +0000 Subject: [PATCH 04/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 95eea2b..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 2.0 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; // tslint-disable-line max-line-length - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index da509d8..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.0.6-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.0.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,b,g,v,c;if(l=s(d.length),p=i(n),b=i(a),g=i(o),(m=t([],4))[p].push(n),m[b].push(a),m[g].push(o),3===(h=m[0].length))j=n;else if(2===h){for(v=1;v<4;v++)if(m[v].length){j=m[v][0];break}}else{for(c=0,v=1;v<4;v++)(f=m[v].length)>=h&&(h=f,c=v);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index d73d41c..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;qcA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index f2a26d4..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From bdaab2c26b25bc8960be970d4be3050d989eb9d6 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 3 Mar 2023 16:45:41 +0000 Subject: [PATCH 05/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 62 - .github/workflows/cancel.yml | 56 - .github/workflows/close_pull_requests.yml | 44 - .github/workflows/examples.yml | 62 - .github/workflows/npm_downloads.yml | 108 - .github/workflows/productionize.yml | 798 --- .github/workflows/publish.yml | 236 - .github/workflows/test.yml | 97 - .github/workflows/test_bundles.yml | 180 - .github/workflows/test_coverage.yml | 123 - .github/workflows/test_install.yml | 83 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/test.js | 142 - 37 files changed, 6201 insertions(+), 3928 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 0fd4d6c..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 06a9a75..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,62 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index a00dbe5..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,56 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - uses: styfle/cancel-workflow-action@0.11.0 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index a2260ee..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,44 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - run: - runs-on: ubuntu-latest - steps: - - uses: superbrothers/close-pull-request@v3 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 7902a7d..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,62 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout the repository' - uses: actions/checkout@v3 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 395879d..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,108 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - uses: actions/upload-artifact@v3 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - uses: distributhor/workflow-webhook@v3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 3e8e2db..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,798 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - uses: actions/checkout@v3 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Format error messages: - - name: 'Replace double quotes with single quotes in rewritten format string error messages' - run: | - find . -name "*.js" -exec sed -E -i "s/Error\( format\( \"([a-zA-Z0-9]+)\"/Error\( format\( '\1'/g" {} \; - - # Format string literal error messages: - - name: 'Replace double quotes with single quotes in rewritten string literal error messages' - run: | - find . -name "*.js" -exec sed -E -i "s/Error\( format\(\"([a-zA-Z0-9]+)\"\)/Error\( format\( '\1' \)/g" {} \; - - # Format code: - - name: 'Replace double quotes with single quotes in inserted `require` calls' - run: | - find . -name "*.js" -exec sed -E -i "s/require\( ?\"@stdlib\/error-tools-fmtprodmsg\" ?\);/require\( '@stdlib\/error-tools-fmtprodmsg' \);/g" {} \; - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/checkout@v3 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v1 - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -164,7 +157,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -228,7 +221,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index 08e85d5..95eea2b 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 2.0 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..da509d8 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.0.6-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.0.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,b,g,v,c;if(l=s(d.length),p=i(n),b=i(a),g=i(o),(m=t([],4))[p].push(n),m[b].push(a),m[g].push(o),3===(h=m[0].length))j=n;else if(2===h){for(v=1;v<4;v++)if(m[v].length){j=m[v][0];break}}else{for(c=0,v=1;v<4;v++)(f=m[v].length)>=h&&(h=f,c=v);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..d73d41c --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;qcA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 564b089..8f9d417 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.0.1", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.0.1", - "@stdlib/array-base-filled": "^0.0.2", - "@stdlib/array-base-take": "^0.0.1", - "@stdlib/array-base-zero-to": "^0.0.6", - "@stdlib/ndarray-base-strides2order": "^0.0.6", - "@stdlib/types": "^0.0.14", - "@stdlib/error-tools-fmtprodmsg": "^0.0.2" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.0.7", - "@stdlib/bench": "^0.0.12", - "@stdlib/ndarray-array": "^0.0.9", - "@stdlib/ndarray-base-shape2strides": "^0.0.8", - "@stdlib/random-base-randu": "^0.0.8", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..d532ea9 --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 697368e4d0c6e40efac1bae32d4c8d03cf57742d Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 3 Mar 2023 16:46:23 +0000 Subject: [PATCH 06/60] Update README.md for ESM bundle v0.0.1 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 84fb1ca..3746949 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ limitations under the License. ## Usage ```javascript -import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@esm/index.mjs'; +import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@v0.0.1-esm/index.mjs'; ``` #### binaryLoopOrder( shape, stridesX, stridesY, stridesZ ) @@ -110,7 +110,7 @@ For all returned arrays, the first element corresponds to the innermost loop, an - - - - From d1b03b8a0da5a0d710c838fc1cae0cbe120687e3 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sun, 24 Sep 2023 16:02:38 +0000 Subject: [PATCH 10/60] Auto-generated commit --- .editorconfig | 186 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 62 - .github/workflows/cancel.yml | 56 - .github/workflows/close_pull_requests.yml | 44 - .github/workflows/examples.yml | 62 - .github/workflows/npm_downloads.yml | 108 - .github/workflows/productionize.yml | 783 --- .github/workflows/publish.yml | 242 - .github/workflows/test.yml | 97 - .github/workflows/test_bundles.yml | 180 - .github/workflows/test_coverage.yml | 123 - .github/workflows/test_install.yml | 83 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/test.js | 142 - 41 files changed, 6201 insertions(+), 3971 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 13e9c39..0000000 --- a/.editorconfig +++ /dev/null @@ -1,186 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 06a9a75..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,62 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index a00dbe5..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,56 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - uses: styfle/cancel-workflow-action@0.11.0 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index a2260ee..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,44 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - run: - runs-on: ubuntu-latest - steps: - - uses: superbrothers/close-pull-request@v3 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 7902a7d..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,62 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout the repository' - uses: actions/checkout@v3 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 395879d..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,108 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - uses: actions/upload-artifact@v3 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - uses: distributhor/workflow-webhook@v3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 91f2b93..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,783 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - uses: actions/checkout@v3 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/checkout@v3 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - uses: act10ns/slack@v2 - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - uses: actions/checkout@v3 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - uses: actions/setup-node@v3 - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 17ef41b..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index 5a2fed7..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,yBAA0B,EAC1CC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index 4868151..76a0cd6 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..b8acf21 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.0.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.0-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..f7a7793 --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 101be41..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.0", - "@stdlib/types": "^0.1.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.0" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.0", - "@stdlib/bench": "^0.1.0", - "@stdlib/ndarray-array": "^0.0.9", - "@stdlib/ndarray-base-shape2strides": "^0.1.0", - "@stdlib/random-base-randu": "^0.0.8", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..229a081 --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 44389493c500cc2b49a332da011ea0d9607bbce8 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sun, 24 Sep 2023 16:10:13 +0000 Subject: [PATCH 11/60] Update README.md for ESM bundle v0.1.0 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1e9b4f2..71bdcfd 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ limitations under the License. ## Usage ```javascript -import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@esm/index.mjs'; +import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@v0.1.0-esm/index.mjs'; ``` #### binaryLoopOrder( shape, stridesX, stridesY, stridesZ ) @@ -121,7 +121,7 @@ For all returned arrays, the first element corresponds to the innermost loop, an - - - - From ecf76b556502f8b9a3f0c58f3292c0b0de1df344 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Tue, 3 Oct 2023 01:22:16 +0000 Subject: [PATCH 15/60] Auto-generated commit --- .editorconfig | 186 - .eslintrc.js | 1 - .gitattributes | 49 - .github/.keepalive | 1 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 247 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 142 - test/test.js | 142 - 43 files changed, 6201 insertions(+), 4172 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/.keepalive delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 13e9c39..0000000 --- a/.editorconfig +++ /dev/null @@ -1,186 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index c7b524a..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2023-10-01T05:13:44.406Z diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index ab56cca..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c1c45e7..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index d93b38b..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA corresponding to v3.0.3: - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 265afda..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 17ef41b..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index 5a2fed7..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,yBAA0B,EAC1CC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index 4868151..76a0cd6 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..923cd14 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.0-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..f7a7793 --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index a768caf..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.0", - "@stdlib/types": "^0.1.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.0" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.0", - "@stdlib/bench": "^0.1.0", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.0", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..619c7bc --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index d9a89cb..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 3e7ceaf61bb74f7790cbb19f45a3ec264bdae4c3 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 5 Oct 2023 19:30:41 +0000 Subject: [PATCH 16/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0f6ceea..cde7003 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take": "^0.1.0", "@stdlib/array-base-zero-to": "^0.1.0", "@stdlib/ndarray-base-strides2order": "^0.1.0", - "@stdlib/types": "^0.1.0" + "@stdlib/types": "^0.1.0", + "@stdlib/error-tools-fmtprodmsg": "^0.1.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.1.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From f331719719733b43760a5b8b6a5a6afb84800173 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sat, 7 Oct 2023 02:27:44 +0000 Subject: [PATCH 17/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 76a0cd6..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; // tslint-disable-line max-line-length - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 923cd14..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.0-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index f7a7793..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index 619c7bc..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 51d5a9a41ba7da356d9768a76b3fcaa456b750ca Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sat, 7 Oct 2023 02:31:20 +0000 Subject: [PATCH 18/60] Auto-generated commit --- .editorconfig | 186 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 247 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 142 - test/test.js | 142 - 42 files changed, 6201 insertions(+), 4171 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 13e9c39..0000000 --- a/.editorconfig +++ /dev/null @@ -1,186 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index ab56cca..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c1c45e7..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index d93b38b..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA corresponding to v3.0.3: - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 265afda..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 17ef41b..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index 5a2fed7..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,yBAA0B,EAC1CC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index 4868151..76a0cd6 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..923cd14 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.0-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..f7a7793 --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index cde7003..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.0", - "@stdlib/types": "^0.1.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.1", - "@stdlib/bench": "^0.1.0", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.1", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..fe303ca --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index d9a89cb..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From ff5caa770edcc98f02c30b54fb1abaa15fd2dd58 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Wed, 1 Nov 2023 17:06:22 +0000 Subject: [PATCH 19/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 28ab212..2a3d002 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take": "^0.1.0", "@stdlib/array-base-zero-to": "^0.1.0", "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.1.0" + "@stdlib/types": "^0.1.0", + "@stdlib/error-tools-fmtprodmsg": "^0.1.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.1.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From c4090bf31d5fec951dc1fc58b0b5445839b32a54 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 3 Nov 2023 01:23:41 +0000 Subject: [PATCH 20/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 76a0cd6..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; // tslint-disable-line max-line-length - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 923cd14..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.0-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index f7a7793..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index fe303ca..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 6fc379eec4d423512ca8a62456cc90b5c06d3d46 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 3 Nov 2023 01:27:37 +0000 Subject: [PATCH 21/60] Auto-generated commit --- .editorconfig | 186 - .eslintrc.js | 1 - .gitattributes | 49 - .github/.keepalive | 1 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 255 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 43 files changed, 6201 insertions(+), 4071 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/.keepalive delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 13e9c39..0000000 --- a/.editorconfig +++ /dev/null @@ -1,186 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index c74b5d3..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2023-11-01T05:31:43.518Z diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index ab56cca..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c1c45e7..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index d93b38b..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA corresponding to v3.0.3: - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 265afda..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/stdlib/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 17ef41b..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index 5a2fed7..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,yBAA0B,EAC1CC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index 4868151..76a0cd6 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..4936061 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..f7a7793 --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 2a3d002..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.1.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.1", - "@stdlib/bench": "^0.1.0", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.1", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..044a92c --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From ee4a5424f84202a83254a8671a6a18256b6f24f6 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 9 Nov 2023 11:20:10 +0000 Subject: [PATCH 22/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 10b0e08..f20c7bc 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take": "^0.1.0", "@stdlib/array-base-zero-to": "^0.1.0", "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0" + "@stdlib/types": "^0.2.0", + "@stdlib/error-tools-fmtprodmsg": "^0.1.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.1.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From bfdaa1c3537daa297b5a6ed8bd3eb13f8b367f66 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 9 Nov 2023 15:09:29 +0000 Subject: [PATCH 23/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 76a0cd6..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; // tslint-disable-line max-line-length - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 4936061..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index f7a7793..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index 044a92c..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 9be4bfb4e8e4441de22f01ec13a5d294af961ca6 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 9 Nov 2023 15:12:18 +0000 Subject: [PATCH 24/60] Auto-generated commit --- .editorconfig | 186 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 255 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 42 files changed, 6201 insertions(+), 4070 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 13e9c39..0000000 --- a/.editorconfig +++ /dev/null @@ -1,186 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index ab56cca..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c1c45e7..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index d93b38b..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA corresponding to v3.0.3: - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 265afda..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 17ef41b..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index 5a2fed7..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,yBAA0B,EAC1CC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..4936061 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..f7a7793 --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6570339..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index f20c7bc..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.1", - "@stdlib/bench": "^0.2.0", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.1", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..58634dd --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 3d975bdcd7237bc895330759a80ecf599c397ded Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 23 Nov 2023 09:53:28 +0000 Subject: [PATCH 25/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 90431f4..a783d4d 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take-indexed": "github:stdlib-js/array-base-take-indexed#main", "@stdlib/array-base-zero-to": "^0.1.0", "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0" + "@stdlib/types": "^0.2.0", + "@stdlib/error-tools-fmtprodmsg": "^0.1.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.1.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From cda1f754afb1e1752d343dd3ea377a02b1b1a156 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 23 Nov 2023 09:56:03 +0000 Subject: [PATCH 26/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 4936061..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import i from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function d(d,n,a,o){var l,m,h,f,j,p,v,b,g,c;if(l=s(d.length),p=i(n),v=i(a),b=i(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(c=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,c=g);j=m[c][0]}return function(s,e){var r,t,i,d,n,a,o,l,m;for(t=1,i=1,m=1;m=0&&!(((l=s[d])<0?-l:l)<=r);)s[d+1]=l,e[n+1]=e[n],d-=1,n-=1;s[d+1]=a,e[n+1]=o,t+=1,i+=1}}(j=e(j),l),{sh:d=r(d,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{d as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index f7a7793..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;0dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index 58634dd..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 63ed626c2b41a38f2a875399b9dd5644e0e64b4b Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 23 Nov 2023 09:58:35 +0000 Subject: [PATCH 27/60] Auto-generated commit --- .editorconfig | 186 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 255 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 42 files changed, 6201 insertions(+), 4070 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 13e9c39..0000000 --- a/.editorconfig +++ /dev/null @@ -1,186 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tslint.json` files: -[tslint.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index ab56cca..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c1c45e7..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index d93b38b..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA corresponding to v3.0.3: - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 265afda..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..7aff7e8 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,b,v,g,x;if(l=e(i.length),p=d(n),b=d(a),v=d(o),(m=t([],4))[p].push(n),m[b].push(a),m[v].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..1465bdc --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;2dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index a783d4d..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take-indexed": "github:stdlib-js/array-base-take-indexed#main", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.1", - "@stdlib/bench": "^0.2.1", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.1", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..534bfa5 --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 1edd0382f98828daeaab0f223f3c5b304734c3b1 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 1 Dec 2023 13:17:17 +0000 Subject: [PATCH 28/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0c76d36..cdee01f 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take-indexed": "^0.1.0", "@stdlib/array-base-zero-to": "^0.1.0", "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0" + "@stdlib/types": "^0.2.0", + "@stdlib/error-tools-fmtprodmsg": "^0.1.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.1.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From 1982c31e25486928734664083e11a64d890895d6 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sat, 2 Dec 2023 11:25:47 +0000 Subject: [PATCH 29/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 7aff7e8..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,b,v,g,x;if(l=e(i.length),p=d(n),b=d(a),v=d(o),(m=t([],4))[p].push(n),m[b].push(a),m[v].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index 1465bdc..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;2dA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index 534bfa5..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From c53eb6c9f067f9265acb54eda33f7acec6f2e2d4 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sat, 2 Dec 2023 11:28:12 +0000 Subject: [PATCH 30/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/.keepalive | 1 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 255 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 227 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 43 files changed, 6201 insertions(+), 4066 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/.keepalive delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index 7e7458d..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2023-12-01T05:36:23.125Z diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index ab56cca..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c1c45e7..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index d93b38b..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA corresponding to v3.0.3: - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 265afda..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA corresponding to v4.1.0 - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 16 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 4bc7750..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..74a53f3 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index cdee01f..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take-indexed": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.1", - "@stdlib/bench": "^0.2.1", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.1", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..faa92ca --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 5a36dbed12f4c7f717ee1c5ced2122d638f79834 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 1 Jan 2024 07:55:51 +0000 Subject: [PATCH 31/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8f56ad1..e335992 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take-indexed": "^0.1.0", "@stdlib/array-base-zero-to": "^0.1.0", "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0" + "@stdlib/types": "^0.2.0", + "@stdlib/error-tools-fmtprodmsg": "^0.1.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.1.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From e6bc1eccc1aedebe553a812c076e1e8f84216f08 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 1 Jan 2024 14:34:08 +0000 Subject: [PATCH 32/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 74a53f3..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2023 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index fbec6bf..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index faa92ca..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 2dfd3b601d8e2d06e40cca18a42f9329d2d3c9d8 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 1 Jan 2024 14:34:33 +0000 Subject: [PATCH 33/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/.keepalive | 1 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 255 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 128 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 228 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 37 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 53 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 44 files changed, 6201 insertions(+), 4072 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/.keepalive delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index be536ce..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2024-01-01T05:06:04.073Z diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 30656c4..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index 3acd3a9..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA corresponding to v0.11.0 - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index c92f5c4..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index f8b12ef..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index e1e3539..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA corresponding to v3.8.1 - uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -175,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -239,7 +232,7 @@ Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index d2612d3..0000000 --- a/branches.md +++ /dev/null @@ -1,53 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers. -- **deno**: [Deno][deno-url] branch for use in Deno. -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments. - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..417526a --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index e335992..2b6cb1b 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.1.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.1.0", - "@stdlib/array-base-filled": "^0.1.0", - "@stdlib/array-base-take-indexed": "^0.1.0", - "@stdlib/array-base-zero-to": "^0.1.0", - "@stdlib/ndarray-base-strides2order": "^0.1.1", - "@stdlib/types": "^0.2.0", - "@stdlib/error-tools-fmtprodmsg": "^0.1.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.1.1", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.1.1", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..265f227 --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 19f8366355bfa6192165b8226c154f84d994e57c Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 15 Feb 2024 02:38:50 +0000 Subject: [PATCH 34/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8e1e5c9..b19dbe6 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take-indexed": "^0.2.0", "@stdlib/array-base-zero-to": "^0.2.0", "@stdlib/ndarray-base-strides2order": "^0.2.0", - "@stdlib/types": "^0.3.1" + "@stdlib/types": "^0.3.1", + "@stdlib/error-tools-fmtprodmsg": "^0.2.0" }, "devDependencies": { "@stdlib/assert-is-array": "^0.2.0", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From c9daadf3da57564f12b2f99e5bbc174a33162093 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 15 Feb 2024 06:25:49 +0000 Subject: [PATCH 35/60] Remove files --- index.d.ts | 103 - index.mjs | 4 - index.mjs.map | 1 - stats.html | 6177 ------------------------------------------------- 4 files changed, 6285 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 417526a..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.1.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.1.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.1.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.1.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index fbec6bf..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index 265f227..0000000 --- a/stats.html +++ /dev/null @@ -1,6177 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 9da5c57e9cc19474a384566b8656df6402e594be Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 15 Feb 2024 06:27:30 +0000 Subject: [PATCH 36/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 --- .github/workflows/publish.yml | 255 - .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 132 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 228 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 6177 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 43 files changed, 6201 insertions(+), 4080 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 87a283f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA corresponding to v3.1.3 - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 9106b5d..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..f8db51f --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.1.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.0-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.0-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.0-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.0-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index b19dbe6..5aef09a 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.0", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.0", - "@stdlib/array-base-filled": "^0.2.0", - "@stdlib/array-base-take-indexed": "^0.2.0", - "@stdlib/array-base-zero-to": "^0.2.0", - "@stdlib/ndarray-base-strides2order": "^0.2.0", - "@stdlib/types": "^0.3.1", - "@stdlib/error-tools-fmtprodmsg": "^0.2.0" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.0", - "@stdlib/ndarray-array": "^0.1.0", - "@stdlib/ndarray-base-shape2strides": "^0.2.0", - "@stdlib/random-base-randu": "^0.1.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..5373e1e --- /dev/null +++ b/stats.html @@ -0,0 +1,6177 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 609959dd299a1edd349872f111ac8b8c91f686c1 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 15 Feb 2024 06:51:47 +0000 Subject: [PATCH 37/60] Update README.md for ESM bundle v0.2.0 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index db44800..05877a4 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ limitations under the License. ## Usage ```javascript -import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@esm/index.mjs'; +import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@v0.2.0-esm/index.mjs'; ``` #### binaryLoopOrder( shape, stridesX, stridesY, stridesZ ) @@ -121,7 +121,7 @@ For all returned arrays, the first element corresponds to the innermost loop, an - - - - From 2ce11293f43565a60abf451547ab4430fef30d46 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sun, 25 Feb 2024 22:16:55 +0000 Subject: [PATCH 41/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 ---- .github/workflows/publish.yml | 249 -- .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 132 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 228 - .npmrc | 28 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 --- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 4842 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 43 files changed, 4866 insertions(+), 4074 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 6ff7e3f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index 9106b5d..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA corresponding to v2.0.0 - uses: act10ns/slack@ed1309ab9862e57e9e583e51c7889486b9a00b0f - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..668b5b3 --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.0-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.1-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.1-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index bc6cc66..3ce5125 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.1", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.1", - "@stdlib/array-base-filled": "^0.2.1", - "@stdlib/array-base-take-indexed": "^0.2.1", - "@stdlib/array-base-zero-to": "^0.2.1", - "@stdlib/ndarray-base-strides2order": "^0.2.1", - "@stdlib/types": "^0.3.2", - "@stdlib/error-tools-fmtprodmsg": "^0.2.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.1", - "@stdlib/ndarray-array": "^0.2.0", - "@stdlib/ndarray-base-shape2strides": "^0.2.1", - "@stdlib/random-base-randu": "^0.2.0", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..37aee69 --- /dev/null +++ b/stats.html @@ -0,0 +1,4842 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From ddf01ba3e25328816aa80f705a9626c2e7fff923 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Sun, 25 Feb 2024 22:33:03 +0000 Subject: [PATCH 42/60] Update README.md for ESM bundle v0.2.1 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 84d4b1d..a486c0c 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ limitations under the License. ## Usage ```javascript -import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@esm/index.mjs'; +import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@v0.2.1-esm/index.mjs'; ``` #### binaryLoopOrder( shape, stridesX, stridesY, stridesZ ) @@ -121,7 +121,7 @@ For all returned arrays, the first element corresponds to the innermost loop, an - - - - From 8ad83a9a54f94a5d6182cfff6d548ce1d818ffff Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 1 Apr 2024 14:05:54 +0000 Subject: [PATCH 46/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/.keepalive | 1 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 ---- .github/workflows/publish.yml | 249 -- .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 132 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 229 - .npmrc | 31 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 --- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 4842 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 44 files changed, 4866 insertions(+), 4079 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/.keepalive delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index 3e6efc0..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2024-04-01T05:50:53.887Z diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 6ff7e3f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index ec90164..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA - uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 # v3.16.2 - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..4a5f7bd --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.1-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.1-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 7cab7d1..3ce5125 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.1", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.1", - "@stdlib/array-base-filled": "^0.2.1", - "@stdlib/array-base-take-indexed": "^0.2.1", - "@stdlib/array-base-zero-to": "^0.2.1", - "@stdlib/ndarray-base-strides2order": "^0.2.1", - "@stdlib/types": "^0.3.2", - "@stdlib/error-tools-fmtprodmsg": "^0.2.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.1", - "@stdlib/ndarray-array": "^0.2.1", - "@stdlib/ndarray-base-shape2strides": "^0.2.1", - "@stdlib/random-base-randu": "^0.2.1", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..ec5df33 --- /dev/null +++ b/stats.html @@ -0,0 +1,4842 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 3d69f913eff0f0a4aa69d8f0669b2318f2e67e70 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 12 Apr 2024 04:35:23 +0000 Subject: [PATCH 47/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9abba84..7cab7d1 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take-indexed": "^0.2.1", "@stdlib/array-base-zero-to": "^0.2.1", "@stdlib/ndarray-base-strides2order": "^0.2.1", - "@stdlib/types": "^0.3.2" + "@stdlib/types": "^0.3.2", + "@stdlib/error-tools-fmtprodmsg": "^0.2.1" }, "devDependencies": { "@stdlib/assert-is-array": "^0.2.1", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From c9de501633ffe3f4e7ef1b926e22cc0704e10487 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 12 Apr 2024 10:16:22 +0000 Subject: [PATCH 48/60] Remove files --- index.d.ts | 103 -- index.mjs | 4 - index.mjs.map | 1 - stats.html | 4842 ------------------------------------------------- 4 files changed, 4950 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 4a5f7bd..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.1-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.1-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index fbec6bf..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index ec5df33..0000000 --- a/stats.html +++ /dev/null @@ -1,4842 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 4a2b56ffde1c79d4ec062acc4bd04983651279c6 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Fri, 12 Apr 2024 10:16:41 +0000 Subject: [PATCH 49/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 49 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 797 ---- .github/workflows/publish.yml | 249 -- .github/workflows/test.yml | 100 - .github/workflows/test_bundles.yml | 189 - .github/workflows/test_coverage.yml | 134 - .github/workflows/test_install.yml | 86 - .gitignore | 188 - .npmignore | 229 - .npmrc | 31 - CHANGELOG.md | 5 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 --- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 4842 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 43 files changed, 4866 insertions(+), 4080 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 10a16e6..0000000 --- a/.gitattributes +++ /dev/null @@ -1,49 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/deps/** linguist-vendored=false -/lib/node_modules/** linguist-vendored=false linguist-generated=false -test/fixtures/** linguist-vendored=false -tools/** linguist-vendored=false - -# Override what is considered "documentation" by GitHub's linguist: -examples/** linguist-documentation=false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 6ff7e3f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index ec90164..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,797 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA - uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 # v3.16.2 - with: - status: ${{ job.status }} - steps: ${{ toJson(steps) }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure git: - - name: 'Configure git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..4a5f7bd --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.1-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.1-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 7cab7d1..3ce5125 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.1", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.1", - "@stdlib/array-base-filled": "^0.2.1", - "@stdlib/array-base-take-indexed": "^0.2.1", - "@stdlib/array-base-zero-to": "^0.2.1", - "@stdlib/ndarray-base-strides2order": "^0.2.1", - "@stdlib/types": "^0.3.2", - "@stdlib/error-tools-fmtprodmsg": "^0.2.1" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.1", - "@stdlib/ndarray-array": "^0.2.1", - "@stdlib/ndarray-base-shape2strides": "^0.2.1", - "@stdlib/random-base-randu": "^0.2.1", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..ec5df33 --- /dev/null +++ b/stats.html @@ -0,0 +1,4842 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From a998a3652ae1e58b5b6a81979d2a81506b6b1401 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 29 Jul 2024 11:51:14 +0000 Subject: [PATCH 50/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d6a7ae..1df803b 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "@stdlib/array-base-take-indexed": "^0.2.2", "@stdlib/array-base-zero-to": "^0.2.1", "@stdlib/ndarray-base-strides2order": "^0.2.2", - "@stdlib/types": "^0.3.2" + "@stdlib/types": "^0.3.2", + "@stdlib/error-tools-fmtprodmsg": "^0.2.2" }, "devDependencies": { "@stdlib/assert-is-array": "^0.2.2", @@ -95,4 +96,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From 06443b547a2ad477bf39ffa2e00f7211332a0c93 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 29 Jul 2024 11:51:35 +0000 Subject: [PATCH 51/60] Remove files --- index.d.ts | 103 -- index.mjs | 4 - index.mjs.map | 1 - stats.html | 4842 ------------------------------------------------- 4 files changed, 4950 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 4a5f7bd..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.1-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.1-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.1-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.1-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index fbec6bf..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index ec5df33..0000000 --- a/stats.html +++ /dev/null @@ -1,4842 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 5cff53e9165638b76f41009f01d0d82f2e92f1ff Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 29 Jul 2024 11:52:11 +0000 Subject: [PATCH 52/60] Auto-generated commit --- .editorconfig | 181 - .eslintrc.js | 1 - .gitattributes | 66 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 794 ---- .github/workflows/publish.yml | 252 -- .github/workflows/test.yml | 99 - .github/workflows/test_bundles.yml | 186 - .github/workflows/test_coverage.yml | 133 - .github/workflows/test_install.yml | 85 - .gitignore | 190 - .npmignore | 229 - .npmrc | 31 - CHANGELOG.md | 162 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 --- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 4842 +++++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 43 files changed, 4866 insertions(+), 4250 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 60d743f..0000000 --- a/.editorconfig +++ /dev/null @@ -1,181 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 -insert_final_newline = false - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = false - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1c88e69..0000000 --- a/.gitattributes +++ /dev/null @@ -1,66 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/lib/node_modules/** -linguist-vendored -linguist-generated - -# Configure directories which should *not* be included in GitHub language statistics: -/deps/** linguist-vendored -/dist/** linguist-generated -/workshops/** linguist-vendored - -benchmark/** linguist-vendored -docs/* linguist-documentation -etc/** linguist-vendored -examples/** linguist-documentation -scripts/** linguist-vendored -test/** linguist-vendored -tools/** linguist-vendored - -# Configure files which should *not* be included in GitHub language statistics: -Makefile linguist-vendored -*.mk linguist-vendored -*.jl linguist-vendored -*.py linguist-vendored -*.R linguist-vendored - -# Configure files which should be included in GitHub language statistics: -docs/types/*.d.ts -linguist-documentation diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 6ff7e3f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index f4575e9..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,794 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA - uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 # v3.16.2 - with: - status: ${{ job.status }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..c14793f --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2024 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.2-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.2-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.2-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.2-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 1df803b..edc218a 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.2", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.2", - "@stdlib/array-base-filled": "^0.2.2", - "@stdlib/array-base-take-indexed": "^0.2.2", - "@stdlib/array-base-zero-to": "^0.2.1", - "@stdlib/ndarray-base-strides2order": "^0.2.2", - "@stdlib/types": "^0.3.2", - "@stdlib/error-tools-fmtprodmsg": "^0.2.2" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.2", - "@stdlib/ndarray-array": "^0.2.1", - "@stdlib/ndarray-base-shape2strides": "^0.2.2", - "@stdlib/random-base-randu": "^0.2.1", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..cf306aa --- /dev/null +++ b/stats.html @@ -0,0 +1,4842 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 20ba09fd03b3b4747c7fe1720d768a61f92eca4a Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 29 Jul 2024 11:52:33 +0000 Subject: [PATCH 53/60] Update README.md for ESM bundle v0.2.2 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4ebf467..1cfaade 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ limitations under the License. ## Usage ```javascript -import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@esm/index.mjs'; +import binaryLoopOrder from 'https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-binary-loop-interchange-order@v0.2.2-esm/index.mjs'; ``` #### binaryLoopOrder( shape, stridesX, stridesY, stridesZ ) @@ -121,7 +121,7 @@ For all returned arrays, the first element corresponds to the innermost loop, an - - - - From 7560e80fdd3131a4fababccee247150647f4fd9c Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Mon, 3 Feb 2025 01:36:50 +0000 Subject: [PATCH 57/60] Auto-generated commit --- .editorconfig | 180 - .eslintrc.js | 1 - .gitattributes | 66 - .github/.keepalive | 1 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 794 --- .github/workflows/publish.yml | 252 - .github/workflows/test.yml | 99 - .github/workflows/test_bundles.yml | 186 - .github/workflows/test_coverage.yml | 133 - .github/workflows/test_install.yml | 85 - .github/workflows/test_published_package.yml | 105 - .gitignore | 190 - .npmignore | 229 - .npmrc | 31 - CHANGELOG.md | 161 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 150 - lib/sort2ins.js | 98 - package.json | 64 +- stats.html | 4842 ++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 142 - 45 files changed, 4866 insertions(+), 4354 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/.keepalive delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .github/workflows/test_published_package.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index dab5d2a..0000000 --- a/.editorconfig +++ /dev/null @@ -1,180 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true # Note: this disables using two spaces to force a hard line break, which is permitted in Markdown. As we don't typically follow that practice (TMK), we should be safe to automatically trim. - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1c88e69..0000000 --- a/.gitattributes +++ /dev/null @@ -1,66 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/lib/node_modules/** -linguist-vendored -linguist-generated - -# Configure directories which should *not* be included in GitHub language statistics: -/deps/** linguist-vendored -/dist/** linguist-generated -/workshops/** linguist-vendored - -benchmark/** linguist-vendored -docs/* linguist-documentation -etc/** linguist-vendored -examples/** linguist-documentation -scripts/** linguist-vendored -test/** linguist-vendored -tools/** linguist-vendored - -# Configure files which should *not* be included in GitHub language statistics: -Makefile linguist-vendored -*.mk linguist-vendored -*.jl linguist-vendored -*.py linguist-vendored -*.R linguist-vendored - -# Configure files which should be included in GitHub language statistics: -docs/types/*.d.ts -linguist-documentation diff --git a/.github/.keepalive b/.github/.keepalive deleted file mode 100644 index f2d3b11..0000000 --- a/.github/.keepalive +++ /dev/null @@ -1 +0,0 @@ -2025-02-03T00:57:55.749Z diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 771bf10..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 6ff7e3f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index f4575e9..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,794 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA - uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 # v3.16.2 - with: - status: ${{ job.status }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2025. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index d76f09f..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(v,e){return function(){return e||v((e={exports:{}}).exports,e),e.exports}};var j=g(function(D,s){ -function b(v,e){var u,n,t,a,i,l,r,h,f,p;for(t=1,a=1,p=1;p=0&&(f=v[i],n=f<0?-f:f,!(n<=u));)v[i+1]=f,e[l+1]=e[l],i-=1,l-=1;v[i+1]=r,e[l+1]=h,t+=1,a+=1}}s.exports=b -});var x=g(function(E,m){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),q=require('@stdlib/array-base-take-indexed/dist'),O=require('@stdlib/array-base-filled/dist'),d=require('@stdlib/ndarray-base-strides2order/dist'),T=j(),k=3;function A(v,e,u,n){var t,a,i,l,r,h,f,p,o,c;if(t=w(v.length),h=d(e),f=d(u),p=d(n),a=O([],4),a[h].push(e),a[f].push(u),a[p].push(n),i=a[0].length,i===k)r=e;else if(i===k-1){for(o=1;o<4;o++)if(a[o].length){r=a[o][0];break}}else{for(c=0,o=1;o<4;o++)l=a[o].length,l>=i&&(i=l,c=o);r=a[c][0]}return r=N(r),T(r,t),v=q(v,t),e=e===r?r:q(e,t),u=u===r?r:q(u,t),n=n===r?r:q(n,t),{sh:v,sx:e,sy:u,sz:n}}m.exports=A -});var B=x();module.exports=B; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index f938de1..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar filled = require( '@stdlib/array-base-filled' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAS,QAAS,2BAA4B,EAC9CC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMZ,EAAQQ,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAMV,EAAQ,CAAC,EAAG,CAAE,EACpBU,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMf,EAAMe,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKN,EAAMM,EAAII,CAAI,EACnBH,EAAOA,IAAOO,EAAQA,EAAMd,EAAMO,EAAIG,CAAI,EAC1CF,EAAOA,IAAOM,EAAQA,EAAMd,EAAMQ,EAAIE,CAAI,EAC1CD,EAAOA,IAAOK,EAAQA,EAAMd,EAAMS,EAAIC,CAAI,EAEnC,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAZ,EAAO,QAAUQ,ICjGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "filled", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..5ffa0bf --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2025 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.2-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.2-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.2-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.2-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..fbec6bf --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 6905c0b..0000000 --- a/lib/main.js +++ /dev/null @@ -1,150 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var filled = require( '@stdlib/array-base-filled' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = filled( [], 4 ); - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = ( sx === arr ) ? arr : take( sx, idx ); - sy = ( sy === arr ) ? arr : take( sy, idx ); - sz = ( sz === arr ) ? arr : take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index ec9ebcf..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index 79ee740..edc218a 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.2", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,40 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.2", - "@stdlib/array-base-filled": "^0.2.2", - "@stdlib/array-base-take-indexed": "^0.2.2", - "@stdlib/array-base-zero-to": "^0.2.1", - "@stdlib/ndarray-base-strides2order": "^0.2.2", - "@stdlib/types": "^0.4.3", - "@stdlib/error-tools-fmtprodmsg": "^0.2.2" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.2", - "@stdlib/ndarray-array": "^0.2.1", - "@stdlib/ndarray-base-shape2strides": "^0.2.2", - "@stdlib/random-base-randu": "^0.2.1", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -91,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..cf306aa --- /dev/null +++ b/stats.html @@ -0,0 +1,4842 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 715e91f..0000000 --- a/test/test.js +++ /dev/null @@ -1,142 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -}); From 99e5142433a7cdff01022d24f20b872ec4676b74 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 8 May 2025 01:28:31 +0000 Subject: [PATCH 58/60] Transform error messages --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 30759bd..fae2094 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,8 @@ "@stdlib/array-base-take-indexed": "^0.2.2", "@stdlib/array-base-zero-to": "^0.2.1", "@stdlib/ndarray-base-strides2order": "^0.2.2", - "@stdlib/types": "^0.4.3" + "@stdlib/types": "^0.4.3", + "@stdlib/error-tools-fmtprodmsg": "^0.2.2" }, "devDependencies": { "@stdlib/assert-is-array": "^0.2.2", @@ -94,4 +95,4 @@ "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} +} \ No newline at end of file From 4f77f357e9439ff8284cd9af89ee5cd30911993a Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 8 May 2025 01:28:51 +0000 Subject: [PATCH 59/60] Remove files --- index.d.ts | 103 -- index.mjs | 4 - index.mjs.map | 1 - stats.html | 4842 ------------------------------------------------- 4 files changed, 4950 deletions(-) delete mode 100644 index.d.ts delete mode 100644 index.mjs delete mode 100644 index.mjs.map delete mode 100644 stats.html diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index 41f22c9..0000000 --- a/index.d.ts +++ /dev/null @@ -1,103 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -// TypeScript Version: 4.1 - -/// - -import { ArrayLike } from '@stdlib/types/array'; - -/** -* Interface describing loop interchange data. -*/ -interface LoopOrderObject { - /** - * Dimensions sorted in loop order. - */ - sh: Array; - - /** - * First input array strides sorted in loop order. - */ - sx: Array; - - /** - * Second input array strides sorted in loop order. - */ - sy: Array; - - /** - * Output array strides sorted in loop order. - */ - sz: Array; -} - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* - When iterating over the elements of a multi-dimensional array, accessing elements which are closer in memory can improve performance. To this end, loop interchange is a technique used in loop nest optimization to improve locality of reference and take advantage of CPU cache. -* -* The purpose of this function is to order ndarray dimensions according to the magnitude of array strides. By using the ordered dimensions and associated strides, one can construct nested loops (one for each dimension) such that the innermost loop iterates over the dimension in which array elements are closest in memory and the outermost loop iterates over the dimension in which array elements are farthest apart in memory. As a consequence, element iteration is optimized to minimize cache misses and ensure locality of reference. -* -* - Cache performance may be degraded if the layout order (i.e., row-major or column-major) differs for the input and output ndarrays. This function is intended to optimize cache performance for the most common layout order. Accordingly, if the output ndarray has a different layout order (e.g., if the input ndarrays are row-major and the output ndarray is column-major), cache misses are likely for the output ndarray. In general, to ensure best performance, input and output ndarrays should have the same layout order. -* -* - The function assumes that the input and output ndarrays have the same shape. Hence, loop interchange order should only be determined **after** broadcasting. -* -* @param sh - array dimensions -* @param sx - first input array stride lengths -* @param sy - second input array stride lengths -* @param sz - output array stride lengths -* @returns loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -declare function binaryLoopOrder( shape: ArrayLike, stridesX: ArrayLike, stridesY: ArrayLike, stridesZ: ArrayLike ): LoopOrderObject; - - -// EXPORTS // - -export = binaryLoopOrder; diff --git a/index.mjs b/index.mjs deleted file mode 100644 index 5ffa0bf..0000000 --- a/index.mjs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) 2025 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 -/// -import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.2-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.2-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-filled@v0.2.2-esm/index.mjs";import d from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.2-esm/index.mjs";function i(i,n,a,o){var l,m,h,f,j,p,v,b,g,x;if(l=e(i.length),p=d(n),v=d(a),b=d(o),(m=t([],4))[p].push(n),m[v].push(a),m[b].push(o),3===(h=m[0].length))j=n;else if(2===h){for(g=1;g<4;g++)if(m[g].length){j=m[g][0];break}}else{for(x=0,g=1;g<4;g++)(f=m[g].length)>=h&&(h=f,x=g);j=m[x][0]}return function(e,s){var r,t,d,i,n,a,o,l,m;for(t=1,d=1,m=1;m=0&&!(((l=e[i])<0?-l:l)<=r);)e[i+1]=l,s[n+1]=s[n],i-=1,n-=1;e[i+1]=a,s[n+1]=o,t+=1,d+=1}}(j=s(j),l),{sh:i=r(i,l),sx:n=n===j?j:r(n,l),sy:a=a===j?j:r(a,l),sz:o=o===j?j:r(o,l)}}export{i as default}; -//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map deleted file mode 100644 index fbec6bf..0000000 --- a/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport filled from '@stdlib/array-base-filled';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = filled( [], 4 );\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = ( sx === arr ) ? arr : take( sx, idx );\n\tsy = ( sy === arr ) ? arr : take( sy, idx );\n\tsz = ( sz === arr ) ? arr : take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20``) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","filled","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;keA8EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAMY,EAAQ,GAAI,IACbR,GAAKS,KAAMjB,GAChBI,EAAKK,GAAKQ,KAAMhB,GAChBG,EAAKM,GAAKO,KAAMf,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAakB,IAARb,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCxFD,SAAmBO,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAjB,EAMJ,IAJAW,EAAK,EACLC,EAAK,EAGCZ,EAAI,EAAGA,EAAIQ,EAAEL,OAAQH,IAAM,CAUhC,IARAU,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDsCCM,CADAtB,EAAMuB,EAAMvB,GACGJ,GAQR,CACNJ,GANDA,EAAKgC,EAAMhC,EAAII,GAOdH,GANDA,EAAOA,IAAOO,EAAQA,EAAMwB,EAAM/B,EAAIG,GAOrCF,GANDA,EAAOA,IAAOM,EAAQA,EAAMwB,EAAM9B,EAAIE,GAOrCD,GANDA,EAAOA,IAAOK,EAAQA,EAAMwB,EAAM7B,EAAIC,GAQvC"} \ No newline at end of file diff --git a/stats.html b/stats.html deleted file mode 100644 index cf306aa..0000000 --- a/stats.html +++ /dev/null @@ -1,4842 +0,0 @@ - - - - - - - - Rollup Visualizer - - - -
- - - - - From 8979eea67982eb3715d0f8dc6477189491d755d9 Mon Sep 17 00:00:00 2001 From: stdlib-bot Date: Thu, 8 May 2025 01:29:28 +0000 Subject: [PATCH 60/60] Auto-generated commit --- .editorconfig | 180 - .eslintrc.js | 1 - .gitattributes | 66 - .github/PULL_REQUEST_TEMPLATE.md | 7 - .github/workflows/benchmark.yml | 64 - .github/workflows/cancel.yml | 57 - .github/workflows/close_pull_requests.yml | 54 - .github/workflows/examples.yml | 64 - .github/workflows/npm_downloads.yml | 112 - .github/workflows/productionize.yml | 794 --- .github/workflows/publish.yml | 252 - .github/workflows/test.yml | 99 - .github/workflows/test_bundles.yml | 186 - .github/workflows/test_coverage.yml | 133 - .github/workflows/test_install.yml | 85 - .github/workflows/test_published_package.yml | 105 - .gitignore | 194 - .npmignore | 229 - .npmrc | 31 - CHANGELOG.md | 205 - CITATION.cff | 30 - CODE_OF_CONDUCT.md | 3 - CONTRIBUTING.md | 3 - Makefile | 534 -- README.md | 39 +- SECURITY.md | 5 - benchmark/benchmark.js | 81 - branches.md | 56 - dist/index.d.ts | 3 - dist/index.js | 7 - dist/index.js.map | 7 - docs/repl.txt | 59 - docs/types/test.ts | 95 - examples/index.js | 33 - docs/types/index.d.ts => index.d.ts | 2 +- index.mjs | 4 + index.mjs.map | 1 + lib/index.js | 58 - lib/main.js | 149 - lib/sort2ins.js | 98 - package.json | 63 +- stats.html | 4842 ++++++++++++++++++ test/dist/test.js | 33 - test/test.js | 208 - 44 files changed, 4866 insertions(+), 4465 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintrc.js delete mode 100644 .gitattributes delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .github/workflows/cancel.yml delete mode 100644 .github/workflows/close_pull_requests.yml delete mode 100644 .github/workflows/examples.yml delete mode 100644 .github/workflows/npm_downloads.yml delete mode 100644 .github/workflows/productionize.yml delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .github/workflows/test_bundles.yml delete mode 100644 .github/workflows/test_coverage.yml delete mode 100644 .github/workflows/test_install.yml delete mode 100644 .github/workflows/test_published_package.yml delete mode 100644 .gitignore delete mode 100644 .npmignore delete mode 100644 .npmrc delete mode 100644 CHANGELOG.md delete mode 100644 CITATION.cff delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 Makefile delete mode 100644 SECURITY.md delete mode 100644 benchmark/benchmark.js delete mode 100644 branches.md delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 docs/repl.txt delete mode 100644 docs/types/test.ts delete mode 100644 examples/index.js rename docs/types/index.d.ts => index.d.ts (97%) create mode 100644 index.mjs create mode 100644 index.mjs.map delete mode 100644 lib/index.js delete mode 100644 lib/main.js delete mode 100644 lib/sort2ins.js create mode 100644 stats.html delete mode 100644 test/dist/test.js delete mode 100644 test/test.js diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index dab5d2a..0000000 --- a/.editorconfig +++ /dev/null @@ -1,180 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# EditorConfig configuration file (see ). - -# Indicate that this file is a root-level configuration file: -root = true - -# Set properties for all files: -[*] -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -# Set properties for JavaScript files: -[*.{js,js.txt}] -indent_style = tab - -# Set properties for JavaScript ES module files: -[*.{mjs,mjs.txt}] -indent_style = tab - -# Set properties for JavaScript CommonJS files: -[*.{cjs,cjs.txt}] -indent_style = tab - -# Set properties for JSON files: -[*.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `cli_opts.json` files: -[cli_opts.json] -indent_style = tab - -# Set properties for TypeScript files: -[*.ts] -indent_style = tab - -# Set properties for Python files: -[*.{py,py.txt}] -indent_style = space -indent_size = 4 - -# Set properties for Julia files: -[*.{jl,jl.txt}] -indent_style = tab - -# Set properties for R files: -[*.{R,R.txt}] -indent_style = tab - -# Set properties for C files: -[*.{c,c.txt}] -indent_style = tab - -# Set properties for C header files: -[*.{h,h.txt}] -indent_style = tab - -# Set properties for C++ files: -[*.{cpp,cpp.txt}] -indent_style = tab - -# Set properties for C++ header files: -[*.{hpp,hpp.txt}] -indent_style = tab - -# Set properties for Fortran files: -[*.{f,f.txt}] -indent_style = space -indent_size = 2 - -# Set properties for shell files: -[*.{sh,sh.txt}] -indent_style = tab - -# Set properties for AWK files: -[*.{awk,awk.txt}] -indent_style = tab - -# Set properties for HTML files: -[*.{html,html.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for XML files: -[*.{xml,xml.txt}] -indent_style = tab -tab_width = 2 - -# Set properties for CSS files: -[*.{css,css.txt}] -indent_style = tab - -# Set properties for Makefiles: -[Makefile] -indent_style = tab - -[*.{mk,mk.txt}] -indent_style = tab - -# Set properties for Markdown files: -[*.{md,md.txt}] -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true # Note: this disables using two spaces to force a hard line break, which is permitted in Markdown. As we don't typically follow that practice (TMK), we should be safe to automatically trim. - -# Set properties for `usage.txt` files: -[usage.txt] -indent_style = space -indent_size = 2 - -# Set properties for `repl.txt` files: -[repl.txt] -indent_style = space -indent_size = 4 - -# Set properties for `package.json` files: -[package.{json,json.txt}] -indent_style = space -indent_size = 2 - -# Set properties for `datapackage.json` files: -[datapackage.json] -indent_style = space -indent_size = 2 - -# Set properties for `manifest.json` files: -[manifest.json] -indent_style = space -indent_size = 2 - -# Set properties for `tsconfig.json` files: -[tsconfig.json] -indent_style = space -indent_size = 2 - -# Set properties for LaTeX files: -[*.{tex,tex.txt}] -indent_style = tab - -# Set properties for LaTeX Bibliography files: -[*.{bib,bib.txt}] -indent_style = tab - -# Set properties for YAML files: -[*.{yml,yml.txt}] -indent_style = space -indent_size = 2 - -# Set properties for GYP files: -[binding.gyp] -indent_style = space -indent_size = 2 - -[*.gypi] -indent_style = space -indent_size = 2 - -# Set properties for citation files: -[*.{cff,cff.txt}] -indent_style = space -indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5f30286..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1 +0,0 @@ -/* For the `eslint` rules of this project, consult the main repository at https://github.com/stdlib-js/stdlib */ diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1c88e69..0000000 --- a/.gitattributes +++ /dev/null @@ -1,66 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2017 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Configuration file which assigns attributes to pathnames. -# -# [1]: https://git-scm.com/docs/gitattributes - -# Automatically normalize the line endings of any committed text files: -* text=auto - -# Override line endings for certain files on checkout: -*.crlf.csv text eol=crlf - -# Denote that certain files are binary and should not be modified: -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.gz binary -*.zip binary -*.7z binary -*.mp3 binary -*.mp4 binary -*.mov binary - -# Override what is considered "vendored" by GitHub's linguist: -/lib/node_modules/** -linguist-vendored -linguist-generated - -# Configure directories which should *not* be included in GitHub language statistics: -/deps/** linguist-vendored -/dist/** linguist-generated -/workshops/** linguist-vendored - -benchmark/** linguist-vendored -docs/* linguist-documentation -etc/** linguist-vendored -examples/** linguist-documentation -scripts/** linguist-vendored -test/** linguist-vendored -tools/** linguist-vendored - -# Configure files which should *not* be included in GitHub language statistics: -Makefile linguist-vendored -*.mk linguist-vendored -*.jl linguist-vendored -*.py linguist-vendored -*.R linguist-vendored - -# Configure files which should be included in GitHub language statistics: -docs/types/*.d.ts -linguist-documentation diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 03a3b6d..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,7 +0,0 @@ - - -We are excited about your pull request, but unfortunately we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. - -If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. You may also consult the [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/contributing/development.md) for help on developing stdlib. - -We look forward to receiving your contribution! :smiley: \ No newline at end of file diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e4f10fe..0000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: benchmark - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run benchmarks: - benchmark: - - # Define a display name: - name: 'Run benchmarks' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run benchmarks: - - name: 'Run benchmarks' - run: | - npm run benchmark diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml deleted file mode 100644 index b5291db..0000000 --- a/.github/workflows/cancel.yml +++ /dev/null @@ -1,57 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: cancel - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to cancel existing workflow runs: - cancel: - - # Define a display name: - name: 'Cancel workflow runs' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Time limit: - timeout-minutes: 3 - - # Define the sequence of job steps... - steps: - - # Cancel existing workflow runs: - - name: 'Cancel existing workflow runs' - # Pin action to full length commit SHA - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # v0.12.1 - with: - workflow_id: >- - benchmark.yml, - examples.yml, - test.yml, - test_coverage.yml, - test_install.yml, - publish.yml - access_token: ${{ github.token }} diff --git a/.github/workflows/close_pull_requests.yml b/.github/workflows/close_pull_requests.yml deleted file mode 100644 index 11c5279..0000000 --- a/.github/workflows/close_pull_requests.yml +++ /dev/null @@ -1,54 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: close_pull_requests - -# Workflow triggers: -on: - pull_request_target: - types: [opened] - -# Workflow jobs: -jobs: - - # Define job to close all pull requests: - run: - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Close pull request - - name: 'Close pull request' - # Pin action to full length commit SHA corresponding to v3.1.2 - uses: superbrothers/close-pull-request@9c18513d320d7b2c7185fb93396d0c664d5d8448 - with: - comment: | - Thank you for submitting a pull request. :raised_hands: - - We greatly appreciate your willingness to submit a contribution. However, we are not accepting pull requests against this repository, as all development happens on the [main project repository](https://github.com/stdlib-js/stdlib). - - We kindly request that you submit this pull request against the [respective directory](https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order) of the main repository where we’ll review and provide feedback. If this is your first stdlib contribution, be sure to read the [contributing guide](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md) which provides guidelines and instructions for submitting contributions. - - Thank you again, and we look forward to receiving your contribution! :smiley: - - Best, - The stdlib team \ No newline at end of file diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml deleted file mode 100644 index 2984901..0000000 --- a/.github/workflows/examples.yml +++ /dev/null @@ -1,64 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2021 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: examples - -# Workflow triggers: -on: - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job to run the package examples... - examples: - - # Define display name: - name: 'Run examples' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - - # Checkout repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Run examples: - - name: 'Run examples' - run: | - npm run examples diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml deleted file mode 100644 index 6ff7e3f..0000000 --- a/.github/workflows/npm_downloads.yml +++ /dev/null @@ -1,112 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: npm_downloads - -# Workflow triggers: -on: - # Run this workflow weekly: - schedule: - # cron: ' ' - - cron: '29 17 * * 4' - - # Allow the workflow to be manually run: - workflow_dispatch: - -# Workflow jobs: -jobs: - - # Define a job for retrieving npm download counts... - npm_downloads: - - # Define display name: - name: 'Retrieve npm download counts' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - timeout-minutes: 10 - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Resolve package name: - - name: 'Resolve package name' - id: package_name - run: | - name=`node -e 'console.log(require("./package.json").name)' | tr -d '\n'` - echo "package_name=$name" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Fetch download data: - - name: 'Fetch data' - id: download_data - run: | - url="https://api.npmjs.org/downloads/range/$(date --date='1 year ago' '+%Y-%m-%d'):$(date '+%Y-%m-%d')/${{ steps.package_name.outputs.package_name }}" - echo "$url" - data=$(curl "$url") - mkdir ./tmp - echo "$data" > ./tmp/npm_downloads.json - echo "data=$data" >> $GITHUB_OUTPUT - timeout-minutes: 5 - - # Print summary of download data: - - name: 'Print summary' - run: | - echo "| Date | Downloads |" >> $GITHUB_STEP_SUMMARY - echo "|------|------------|" >> $GITHUB_STEP_SUMMARY - cat ./tmp/npm_downloads.json | jq -r ".downloads | .[-14:] | to_entries | map(\"| \(.value.day) | \(.value.downloads) |\") |.[]" >> $GITHUB_STEP_SUMMARY - - # Upload the download data: - - name: 'Upload data' - # Pin action to full length commit SHA - uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 - with: - # Define a name for the uploaded artifact (ensuring a unique name for each job): - name: npm_downloads - - # Specify the path to the file to upload: - path: ./tmp/npm_downloads.json - - # Specify the number of days to retain the artifact (default is 90 days): - retention-days: 90 - timeout-minutes: 10 - if: success() - - # Send data to events server: - - name: 'Post data' - # Pin action to full length commit SHA - uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3 - env: - webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }} - webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }} - data: '{ "downloads": ${{ steps.download_data.outputs.data }} }' - timeout-minutes: 5 - if: success() diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml deleted file mode 100644 index f4575e9..0000000 --- a/.github/workflows/productionize.yml +++ /dev/null @@ -1,794 +0,0 @@ -#/ -# @license Apache-2.0 -# -# Copyright (c) 2022 The Stdlib Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#/ - -# Workflow name: -name: productionize - -# Workflow triggers: -on: - # Run workflow when a new commit is pushed to the main branch: - push: - branches: - - main - - # Allow the workflow to be manually run: - workflow_dispatch: - inputs: - require-passing-tests: - description: 'Require passing tests for creating bundles' - type: boolean - default: true - - # Run workflow upon completion of `publish` workflow run: - workflow_run: - workflows: ["publish"] - types: [completed] - - -# Concurrency group to prevent multiple concurrent executions: -concurrency: - group: productionize - cancel-in-progress: true - -# Workflow jobs: -jobs: - - # Define a job to create a production build... - productionize: - - # Define display name: - name: 'Productionize' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Define the sequence of job steps... - steps: - # Checkout main branch of repository: - - name: 'Checkout main branch' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - ref: main - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Create production branch: - - name: 'Create production branch' - run: | - git checkout -b production - - # Transform error messages: - - name: 'Transform error messages' - id: transform-error-messages - uses: stdlib-js/transform-errors-action@main - - # Change `@stdlib/string-format` to `@stdlib/error-tools-fmtprodmsg` in package.json if the former is a dependency, otherwise insert it as a dependency: - - name: 'Update dependencies in package.json' - run: | - PKG_VERSION=$(npm view @stdlib/error-tools-fmtprodmsg version) - if grep -q '"@stdlib/string-format"' package.json; then - sed -i "s/\"@stdlib\/string-format\": \"^.*\"/\"@stdlib\/error-tools-fmtprodmsg\": \"^$PKG_VERSION\"/g" package.json - else - node -e "var pkg = require( './package.json' ); pkg.dependencies[ '@stdlib/error-tools-fmtprodmsg' ] = '^$PKG_VERSION'; require( 'fs' ).writeFileSync( 'package.json', JSON.stringify( pkg, null, 2 ) );" - fi - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Transform error messages" - - # Push changes: - - name: 'Push changes' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" production --force - - # Define a job for running tests of the productionized code... - test: - - # Define a display name: - name: 'Run Tests' - - # Define the type of virtual host machine: - runs-on: 'ubuntu-latest' - - # Indicate that this job depends on the prior job finishing: - needs: productionize - - # Run this job regardless of the outcome of the prior job: - if: always() - - # Define the sequence of job steps... - steps: - - # Checkout the repository: - - name: 'Checkout repository' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - with: - # Use the `production` branch: - ref: production - - # Install Node.js: - - name: 'Install Node.js' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Build native add-on if present: - - name: 'Build native add-on (if present)' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - run: | - if [ -f "binding.gyp" ]; then - npm install node-gyp --no-save && ./node_modules/.bin/node-gyp rebuild - fi - - # Run tests: - - name: 'Run tests' - if: ${{ github.event.inputs.require-passing-tests == 'true' }} - id: tests - run: | - npm test || npm test || npm test - - # Define job to create a bundle for use in Deno... - deno: - - # Define display name: - name: 'Create Deno bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `deno` branch exists: - - name: 'Check if remote `deno` branch exists' - id: deno-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin deno - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `deno` exists, delete everything in branch and merge `production` into it - - name: 'If `deno` exists, delete everything in branch and merge `production` into it' - if: steps.deno-branch-exists.outputs.remote-exists - run: | - git checkout -b deno origin/deno - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `deno` does not exist, create `deno` branch: - - name: 'If `deno` does not exist, create `deno` branch' - if: ${{ steps.deno-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b deno - - # Copy files to deno directory: - - name: 'Copy files to deno directory' - run: | - mkdir -p deno - cp README.md LICENSE CONTRIBUTORS NOTICE ./deno - - # Copy TypeScript definitions to deno directory: - if [ -d index.d.ts ]; then - cp index.d.ts ./deno/index.d.ts - fi - if [ -e ./docs/types/index.d.ts ]; then - cp ./docs/types/index.d.ts ./deno/mod.d.ts - fi - - # Install Node.js: - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: Install production and development dependencies - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Bundle package for use in Deno: - - name: 'Bundle package for Deno' - id: deno-bundle - uses: stdlib-js/bundle-action@main - with: - target: 'deno' - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - # Replace links to other packages with links to the deno branch: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/deno/"; - - # Replace reference to `@stdlib/types` with CDN link: - find ./deno -type f -name '*.ts' -print0 | xargs -0 -r sed -Ei "s/\/\/\/ /\/\/\/ /g" - - # Change wording of project description to avoid reference to JavaScript and Node.js: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "s/a standard library for JavaScript and Node.js, /a standard library /g" - - # Rewrite all `require()`s to use jsDelivr links: - find ./deno -type f -name '*.md' -print0 | xargs -0 sed -Ei "/require\( '@stdlib\// { - s/(var|let|const)\s+([a-z0-9_]+)\s+=\s*require\( '([^']+)' \);/import \2 from \'\3\';/i - s/@stdlib/https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js/ - s/';/@deno\/mod.js';/ - }" - - # Rewrite first `import` to show importing of named exports if available: - exports=$(cat lib/index.js | \ - grep -E 'setReadOnly\(.*,.*,.*\)' | \ - sed -E 's/setReadOnly\((.*),(.*),(.*)\);/\2/' | \ - sed -E "s/'//g" | \ - sort) - if [ -n "$exports" ]; then - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\nimport\s+([a-zA-Z0-9_]+)\s+from\s*'([^']+)';\n\`\`\`/\`\`\`javascript\nimport \1 from '\2';\n\`\`\`\n\nYou can also import the following named exports from the package:\n\n\`\`\`javascript\nimport { $(echo $exports | sed -E 's/ /, /g') } from '\2';\n\`\`\`/" - fi - - # Remove `installation`, `cli`, and `c` sections: - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./deno -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Create package.json file for deno branch: - jq --indent 2 '{"name": .name, "version": .version, "description": .description, "license": .license, "type": "module", "main": "./mod.js", "homepage": .homepage, "repository": .repository, "bugs": .bugs, "keywords": .keywords, "funding": .funding}' package.json > ./deno/package.json - - # Delete everything in current directory aside from deno folder: - - name: 'Delete everything in current directory aside from deno folder' - run: | - find . -type 'f' | grep -v -e "deno" -e ".git/" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e "deno" -e ".git" | xargs -r rm -rf - - # Move deno directory to root: - - name: 'Move deno directory to root' - run: | - mv ./deno/* . - rmdir ./deno - - # Commit changes: - - name: 'Commit changes' - run: | - git add -A - git commit -m "Auto-generated commit" - - # Push changes to `deno` branch: - - name: 'Push changes to `deno` branch' - run: | - SLUG=${{ github.repository }} - echo "Pushing changes to $SLUG..." - git push "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$SLUG.git" deno - - # Send status to Slack channel if job fails: - - name: 'Send status to Slack channel in case of failure' - # Pin action to full length commit SHA - uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 # v3.16.2 - with: - status: ${{ job.status }} - channel: '#npm-ci' - if: failure() - - # Define job to create a UMD bundle... - umd: - - # Define display name: - name: 'Create UMD bundle' - - # Define the type of virtual host machine on which to run the job: - runs-on: ubuntu-latest - - # Indicate that this job depends on the test job finishing: - needs: test - - # Define the sequence of job steps... - steps: - # Checkout the repository: - - name: 'Checkout repository' - # Pin action to full length commit SHA - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 - - # Configure Git: - - name: 'Configure Git' - run: | - git config --local user.email "noreply@stdlib.io" - git config --local user.name "stdlib-bot" - - # Check if remote `umd` branch exists: - - name: 'Check if remote `umd` branch exists' - id: umd-branch-exists - continue-on-error: true - run: | - git fetch --all - git ls-remote --exit-code --heads origin umd - if [ $? -eq 0 ]; then - echo "remote-exists=true" >> $GITHUB_OUTPUT - else - echo "remote-exists=false" >> $GITHUB_OUTPUT - fi - - # If `umd` exists, delete everything in branch and merge `production` into it - - name: 'If `umd` exists, delete everything in branch and merge `production` into it' - if: steps.umd-branch-exists.outputs.remote-exists - run: | - git checkout -b umd origin/umd - - find . -type 'f' | grep -v -e ".git/" -e "package.json" -e "README.md" -e "LICENSE" -e "CONTRIBUTORS" -e "NOTICE" | xargs -r rm - find . -mindepth 1 -type 'd' | grep -v -e ".git" | xargs -r rm -rf - - git add -A - git commit -m "Remove files" --allow-empty - - git config merge.theirs.name 'simulate `-s theirs`' - git config merge.theirs.driver 'cat %B > %A' - GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge origin/production --allow-unrelated-histories - - # Copy files from `production` branch if necessary: - git checkout origin/production -- . - if [ -n "$(git status --porcelain)" ]; then - git add -A - git commit -m "Auto-generated commit" - fi - - # If `umd` does not exist, create `umd` branch: - - name: 'If `umd` does not exist, create `umd` branch' - if: ${{ steps.umd-branch-exists.outputs.remote-exists == false }} - run: | - git checkout production - git checkout -b umd - - # Copy files to umd directory: - - name: 'Copy files to umd directory' - run: | - mkdir -p umd - cp README.md LICENSE CONTRIBUTORS NOTICE ./umd - - # Install Node.js - - name: 'Install Node.js' - # Pin action to full length commit SHA - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - with: - node-version: 20 - timeout-minutes: 5 - - # Install dependencies: - - name: 'Install production and development dependencies' - id: install - run: | - npm install || npm install || npm install - timeout-minutes: 15 - - # Extract alias: - - name: 'Extract alias' - id: extract-alias - run: | - alias=$(grep -E 'require\(' README.md | head -n 1 | sed -E 's/^var ([a-zA-Z0-9_]+) = .+/\1/') - echo "alias=${alias}" >> $GITHUB_OUTPUT - - # Create Universal Module Definition (UMD) Node.js bundle: - - name: 'Create Universal Module Definition (UMD) Node.js bundle' - id: umd-bundle-node - uses: stdlib-js/bundle-action@main - with: - target: 'umd-node' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Create Universal Module Definition (UMD) browser bundle: - - name: 'Create Universal Module Definition (UMD) browser bundle' - id: umd-bundle-browser - uses: stdlib-js/bundle-action@main - with: - target: 'umd-browser' - alias: ${{ steps.extract-alias.outputs.alias }} - - # Rewrite file contents: - - name: 'Rewrite file contents' - run: | - - # Replace links to other packages with links to the umd branch: - find ./umd -type f -name '*.md' -print0 | xargs -0 sed -Ei "/\/tree\/main/b; /^\[@stdlib[^:]+: https:\/\/github.com\/stdlib-js\// s/(.*)/\\1\/tree\/umd/"; - - # Remove `installation`, `cli`, and `c` sections: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/
[^<]+<\/section>//g;" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.cli \-\->//g" - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/(\* \* \*\n+)?
[\s\S]+<\!\-\- \/.c \-\->//g" - - # Rewrite first `require()` to show consumption of the UMD bundle in Observable and via a `script` tag: - find ./umd -type f -name '*.md' -print0 | xargs -0 perl -0777 -i -pe "s/\`\`\`javascript\n(var|let|const)\s+([a-zA-Z0-9_]+)\s+=\s*require\( '\@stdlib\/([^']+)' \);\n\`\`\`/To use in Observable,\n\n\`\`\`javascript\n\2 = require\( 'https:\/\/cdn.jsdelivr.net\/gh\/stdlib-js\/\3\@umd\/browser.js' \)\n\`\`\`\n\nTo vendor stdlib functionality and avoid installing dependency trees for Node.js, you can use the UMD server build:\n\n\`\`\`javascript\nvar \2 = require\( 'path\/to\/vendor\/umd\/\3\/index.js' \)\n\`\`\`\n\nTo include the bundle in a webpage,\n\n\`\`\`html\n + + ```
@@ -177,7 +168,7 @@ console.log( o ); ## Notice -This package is part of [stdlib][stdlib], a standard library for JavaScript and Node.js, with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. +This package is part of [stdlib][stdlib], a standard library with an emphasis on numerical and scientific computing. The library provides a collection of robust, high performance libraries for mathematics, statistics, streams, utilities, and more. For more information on the project, filing bug reports and feature requests, and guidance on how to develop [stdlib][stdlib], see the main project [repository][stdlib]. @@ -244,7 +235,7 @@ Copyright © 2016-2025. The Stdlib [Authors][stdlib-authors]. [loop-nest-optimization]: https://en.wikipedia.org/wiki/Loop_nest_optimization -[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor +[@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor/tree/esm
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 9702d4c..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -> Policy for reporting security vulnerabilities. - -See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security). diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js deleted file mode 100644 index 6c1ef4f..0000000 --- a/benchmark/benchmark.js +++ /dev/null @@ -1,81 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var bench = require( '@stdlib/bench-harness' ); -var randu = require( '@stdlib/random-base-randu' ); -var isArray = require( '@stdlib/assert-is-array' ); -var shape2strides = require( '@stdlib/ndarray-base-shape2strides' ); -var pkg = require( './../package.json' ).name; -var loopOrder = require( './../lib' ); - - -// MAIN // - -bench( pkg+'::row-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'row-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); - -bench( pkg+'::column-major', function benchmark( b ) { - var strides; - var shape; - var out; - var i; - - shape = [ 10, 10, 10 ]; - strides = shape2strides( shape, 'column-major' ); - - b.tic(); - for ( i = 0; i < b.iterations; i++ ) { - strides[ i%shape.length ] *= ( randu() < 0.5 ) ? -1 : 1; - out = loopOrder( shape, strides, strides, strides ); - if ( typeof out !== 'object' ) { - b.fail( 'should return an object' ); - } - } - b.toc(); - if ( !isArray( out.sh ) || !isArray( out.sx ) || !isArray( out.sy ) || !isArray( out.sz ) ) { // eslint-disable-line max-len - b.fail( 'should return an array' ); - } - b.pass( 'benchmark finished' ); - b.end(); -}); diff --git a/branches.md b/branches.md deleted file mode 100644 index 71e7d06..0000000 --- a/branches.md +++ /dev/null @@ -1,56 +0,0 @@ - - -# Branches - -This repository has the following branches: - -- **main**: default branch generated from the [stdlib project][stdlib-url], where all development takes place. -- **production**: [production build][production-url] of the package (e.g., reformatted error messages to reduce bundle sizes and thus the number of bytes transmitted over a network). -- **esm**: [ES Module][esm-url] branch for use via a `script` tag without the need for installation and bundlers (see [README][esm-readme]). -- **deno**: [Deno][deno-url] branch for use in Deno (see [README][deno-readme]). -- **umd**: [UMD][umd-url] branch for use in Observable, or in dual browser/Node.js environments (see [README][umd-readme]). - -The following diagram illustrates the relationships among the above branches: - -```mermaid -graph TD; -A[stdlib]-->|generate standalone package|B; -B[main] -->|productionize| C[production]; -C -->|bundle| D[esm]; -C -->|bundle| E[deno]; -C -->|bundle| F[umd]; - -%% click A href "https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order" -%% click B href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/main" -%% click C href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production" -%% click D href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm" -%% click E href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno" -%% click F href "https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd" -``` - -[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/binary-loop-interchange-order -[production-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/production -[deno-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/deno -[deno-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/deno/README.md -[umd-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/umd -[umd-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/umd/README.md -[esm-url]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/tree/esm -[esm-readme]: https://github.com/stdlib-js/ndarray-base-binary-loop-interchange-order/blob/esm/README.md \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 9b7cb43..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -/// -import binaryLoopOrder from '../docs/types/index'; -export = binaryLoopOrder; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 002bdad..0000000 --- a/dist/index.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict";var g=function(a,r){return function(){return r||a((r={exports:{}}).exports,r),r.exports}};var x=g(function(C,d){ -function b(a,r){var n,f,t,e,v,u,i,s,l,p;for(t=1,e=1,p=1;p=0&&(l=a[v],f=l<0?-l:l,!(f<=n));)a[v+1]=l,r[u+1]=r[u],v-=1,u-=1;a[v+1]=i,r[u+1]=s,t+=1,e+=1}}d.exports=b -});var m=g(function(D,k){ -var w=require('@stdlib/array-base-zero-to/dist'),N=require('@stdlib/array-base-copy-indexed/dist'),h=require('@stdlib/array-base-take-indexed/dist'),q=require('@stdlib/ndarray-base-strides2order/dist'),O=x(),j=3;function T(a,r,n,f){var t,e,v,u,i,s,l,p,o,c;if(t=w(a.length),s=q(r),l=q(n),p=q(f),e=[[],[],[],[]],e[s].push(r),e[l].push(n),e[p].push(f),v=e[0].length,v===j)i=r;else if(v===j-1){for(o=1;o<4;o++)if(e[o].length){i=e[o][0];break}}else{for(c=0,o=1;o<4;o++)u=e[o].length,u>=v&&(v=u,c=o);i=e[c][0]}return i=N(i),O(i,t),a=h(a,t),r=h(r,t),n=h(n,t),f=h(f,t),{sh:a,sx:r,sy:n,sz:f}}k.exports=T -});var A=m();module.exports=A; -/** @license Apache-2.0 */ -//# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index c9b2d54..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../lib/sort2ins.js", "../lib/main.js", "../lib/index.js"], - "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20`) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nmodule.exports = sort2ins;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nvar zeroTo = require( '@stdlib/array-base-zero-to' );\nvar copy = require( '@stdlib/array-base-copy-indexed' );\nvar take = require( '@stdlib/array-base-take-indexed' );\nvar strides2order = require( '@stdlib/ndarray-base-strides2order' );\nvar sort2ins = require( './sort2ins.js' );\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = [ [], [], [], [] ];\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = take( sx, idx );\n\tsy = take( sy, idx );\n\tsz = take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nmodule.exports = loopOrder;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n/**\n* Reorder ndarray dimensions and associated strides for loop interchange.\n*\n* @module @stdlib/ndarray-base-binary-loop-interchange-order\n*\n* @example\n* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' );\n*\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\n\n// MODULES //\n\nvar main = require( './main.js' );\n\n\n// EXPORTS //\n\nmodule.exports = main;\n"], - "mappings": "uGAAA,IAAAA,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAkDA,SAASC,EAAUC,EAAGC,EAAI,CACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAMJ,IAJAP,EAAK,EACLC,EAAK,EAGCM,EAAI,EAAGA,EAAIX,EAAE,OAAQW,IAAM,CAUhC,IATAH,EAAKR,EAAGI,CAAG,EACXF,EAAQM,EAAK,EAAM,CAACA,EAAKA,EAEzBC,EAAKR,EAAGI,CAAG,EAEXC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,IACbI,EAAKV,EAAGM,CAAG,EACXH,EAAQO,EAAK,EAAM,CAACA,EAAKA,EACpB,EAAAP,GAAOD,KAGZF,EAAGM,EAAG,CAAE,EAAII,EACZT,EAAGM,EAAG,CAAE,EAAIN,EAAGM,CAAG,EAClBD,GAAM,EACNC,GAAM,EAEPP,EAAGM,EAAG,CAAE,EAAIE,EACZP,EAAGM,EAAG,CAAE,EAAIE,EACZL,GAAM,EACNC,GAAM,CACP,CACD,CAKAP,EAAO,QAAUC,ICjGjB,IAAAa,EAAAC,EAAA,SAAAC,EAAAC,EAAA,cAsBA,IAAIC,EAAS,QAAS,4BAA6B,EAC/CC,EAAO,QAAS,iCAAkC,EAClDC,EAAO,QAAS,iCAAkC,EAClDC,EAAgB,QAAS,oCAAqC,EAC9DC,EAAW,IAMXC,EAAI,EA6CR,SAASC,EAAWC,EAAIC,EAAIC,EAAIC,EAAK,CACpC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMX,EAAQO,EAAG,MAAO,EAGxBS,EAAKb,EAAeK,CAAG,EACvBS,EAAKd,EAAeM,CAAG,EACvBS,EAAKf,EAAeO,CAAG,EAGvBE,EAAM,CAAE,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAE,EACvBA,EAAKI,CAAG,EAAE,KAAMR,CAAG,EACnBI,EAAKK,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAKM,CAAG,EAAE,KAAMR,CAAG,EACnBG,EAAMD,EAAK,CAAE,EAAE,OACVC,IAAQR,EAEZU,EAAMP,UACKK,IAAQR,EAAE,GAErB,IAAMc,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,CAAE,EAAE,OAAS,CACtBJ,EAAMH,EAAKO,CAAE,EAAG,CAAE,EAClB,KACD,MAEK,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,IACnBL,EAAMF,EAAKO,CAAE,EAAE,OACVL,GAAOD,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,CAAE,EAAG,CAAE,CACnB,CAEA,OAAAL,EAAMd,EAAMc,CAAI,EAChBX,EAAUW,EAAKJ,CAAI,EAGnBJ,EAAKL,EAAMK,EAAII,CAAI,EACnBH,EAAKN,EAAMM,EAAIG,CAAI,EACnBF,EAAKP,EAAMO,EAAIE,CAAI,EACnBD,EAAKR,EAAMQ,EAAIC,CAAI,EAEZ,CACN,GAAMJ,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,CACP,CACD,CAKAX,EAAO,QAAUO,IChGjB,IAAIe,EAAO,IAKX,OAAO,QAAUA", - "names": ["require_sort2ins", "__commonJSMin", "exports", "module", "sort2ins", "x", "y", "avx", "aux", "ix", "iy", "jx", "jy", "vx", "vy", "ux", "i", "require_main", "__commonJSMin", "exports", "module", "zeroTo", "copy", "take", "strides2order", "sort2ins", "N", "loopOrder", "sh", "sx", "sy", "sz", "idx", "tmp", "max", "len", "arr", "ox", "oy", "oz", "i", "j", "main"] -} diff --git a/docs/repl.txt b/docs/repl.txt deleted file mode 100644 index ac50255..0000000 --- a/docs/repl.txt +++ /dev/null @@ -1,59 +0,0 @@ - -{{alias}}( shape, stridesX, stridesY, stridesZ ) - Reorders ndarray dimensions and associated strides for loop interchange. - - The function returns an object having the following properties: - - - sh: ordered dimensions. - - sx: first input array strides sorted in loop order. - - sy: second input array strides sorted in loop order. - - sz: output array strides sorted in loop order. - - For all returned arrays, the first element corresponds to the innermost - loop, and the last element corresponds to the outermost loop. - - The function assumes that the input and output ndarrays have the same shape. - Hence, loop interchange order should only be determined after broadcasting. - - Parameters - ---------- - shape: ArrayLikeObject - Array dimensions. - - stridesX: ArrayLikeObject - First input array strides. - - stridesY: ArrayLikeObject - Second input array strides. - - stridesZ: ArrayLikeObject - Output array strides. - - Returns - ------- - out: Object - Loop interchange data. - - out.sh: Array - Ordered dimensions. - - out.sx: Array - First input array strides sorted in loop order. - - out.sy: Array - Second input array strides sorted in loop order. - - out.sz: Array - Output array strides sorted in loop order. - - Examples - -------- - > var x = {{alias:@stdlib/ndarray/array}}( [ [ 1, 2 ], [ 3, 4 ] ] ); - > var y = {{alias:@stdlib/ndarray/array}}( [ [ 5, 6 ], [ 7, 8 ] ] ); - > var z = {{alias:@stdlib/ndarray/array}}( [ [ 0, 0 ], [ 0, 0 ] ] ); - > var o = {{alias}}( x.shape, x.strides, y.strides, z.strides ) - {...} - - See Also - -------- - diff --git a/docs/types/test.ts b/docs/types/test.ts deleted file mode 100644 index afacf09..0000000 --- a/docs/types/test.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import binaryLoopOrder = require( './index' ); - - -// TESTS // - -// The function returns an object... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, sy, sz ); // $ExpectType LoopOrderObject -} - -// The compiler throws an error if the function is provided a first argument which is not an array-like object of numbers... -{ - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( true, sx, sy, sz ); // $ExpectError - binaryLoopOrder( false, sx, sy, sz ); // $ExpectError - binaryLoopOrder( '5', sx, sy, sz ); // $ExpectError - binaryLoopOrder( 123, sx, sy, sz ); // $ExpectError - binaryLoopOrder( {}, sx, sy, sz ); // $ExpectError - binaryLoopOrder( ( x: number ): number => x, sx, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a second argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, true, sy, sz ); // $ExpectError - binaryLoopOrder( sh, false, sy, sz ); // $ExpectError - binaryLoopOrder( sh, '5', sy, sz ); // $ExpectError - binaryLoopOrder( sh, 123, sy, sz ); // $ExpectError - binaryLoopOrder( sh, {}, sy, sz ); // $ExpectError - binaryLoopOrder( sh, ( x: number ): number => x, sy, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a third argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder( sh, sx, true, sz ); // $ExpectError - binaryLoopOrder( sh, sx, false, sz ); // $ExpectError - binaryLoopOrder( sh, sx, '5', sz ); // $ExpectError - binaryLoopOrder( sh, sx, 123, sz ); // $ExpectError - binaryLoopOrder( sh, sx, {}, sz ); // $ExpectError -} - -// The compiler throws an error if the function is provided a fourth argument which is not an array-like object of numbers... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - binaryLoopOrder( sh, sx, sy, true ); // $ExpectError - binaryLoopOrder( sh, sx, sy, false ); // $ExpectError - binaryLoopOrder( sh, sx, sy, '5' ); // $ExpectError - binaryLoopOrder( sh, sx, sy, 123 ); // $ExpectError - binaryLoopOrder( sh, sx, sy, {} ); // $ExpectError - binaryLoopOrder( sh, sx, sy, ( x: number ): number => x ); // $ExpectError -} - -// The compiler throws an error if the function is provided an unsupported number of arguments... -{ - const sh = [ 2, 2 ]; - const sx = [ 2, 1 ]; - const sy = [ 2, 1 ]; - const sz = [ 4, 2 ]; - binaryLoopOrder(); // $ExpectError - binaryLoopOrder( sh ); // $ExpectError - binaryLoopOrder( sh, sx ); // $ExpectError - binaryLoopOrder( sh, sx, sy ); // $ExpectError - binaryLoopOrder( sh, sx, sy, sz, [] ); // $ExpectError -} diff --git a/examples/index.js b/examples/index.js deleted file mode 100644 index 729faef..0000000 --- a/examples/index.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -var array = require( '@stdlib/ndarray-array' ); -var loopOrder = require( './../lib' ); - -// Create ndarrays: -var x = array( [ [ 1, 2 ], [ 3, 4 ] ] ); -var y = array( [ [ 5, 6 ], [ 7, 8 ] ] ); -var z = array( [ [ 0, 0 ], [ 0, 0 ] ] ); - -// Resolve loop interchange data: -var o = loopOrder( x.shape, x.strides, y.strides, z.strides ); -// returns {...} - -console.log( o ); diff --git a/docs/types/index.d.ts b/index.d.ts similarity index 97% rename from docs/types/index.d.ts rename to index.d.ts index dbe5fed..41f22c9 100644 --- a/docs/types/index.d.ts +++ b/index.d.ts @@ -18,7 +18,7 @@ // TypeScript Version: 4.1 -/// +/// import { ArrayLike } from '@stdlib/types/array'; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..fc8e80f --- /dev/null +++ b/index.mjs @@ -0,0 +1,4 @@ +// Copyright (c) 2025 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0 +/// +import e from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-zero-to@v0.2.1-esm/index.mjs";import s from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-copy-indexed@v0.2.2-esm/index.mjs";import r from"https://cdn.jsdelivr.net/gh/stdlib-js/array-base-take-indexed@v0.2.2-esm/index.mjs";import t from"https://cdn.jsdelivr.net/gh/stdlib-js/ndarray-base-strides2order@v0.2.2-esm/index.mjs";function n(n,d,i,o){var a,h,l,m,f,p,j,v,b,g;if(a=e(n.length),p=t(d),j=t(i),v=t(o),(h=[[],[],[],[]])[p].push(d),h[j].push(i),h[v].push(o),3===(l=h[0].length))f=d;else if(2===l){for(b=1;b<4;b++)if(h[b].length){f=h[b][0];break}}else{for(g=0,b=1;b<4;b++)(m=h[b].length)>=l&&(l=m,g=b);f=h[g][0]}return function(e,s){var r,t,n,d,i,o,a,h,l;for(t=1,n=1,l=1;l=0&&!(((h=e[d])<0?-h:h)<=r);)e[d+1]=h,s[i+1]=s[i],d-=1,i-=1;e[d+1]=o,s[i+1]=a,t+=1,n+=1}}(f=s(f),a),{sh:n=r(n,a),sx:d=r(d,a),sy:i=r(i,a),sz:o=r(o,a)}}export{n as default}; +//# sourceMappingURL=index.mjs.map diff --git a/index.mjs.map b/index.mjs.map new file mode 100644 index 0000000..288d397 --- /dev/null +++ b/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"index.mjs","sources":["../lib/main.js","../lib/sort2ins.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MODULES //\n\nimport zeroTo from '@stdlib/array-base-zero-to';\nimport copy from '@stdlib/array-base-copy-indexed';\nimport take from '@stdlib/array-base-take-indexed';\nimport strides2order from '@stdlib/ndarray-base-strides2order';\nimport sort2ins from './sort2ins.js';\n\n\n// VARIABLES //\n\n// Number of arrays:\nvar N = 3;\n\n\n// MAIN //\n\n/**\n* Reorders ndarray dimensions and associated strides for loop interchange.\n*\n* ## Notes\n*\n* - The returned object has the following properties:\n*\n* - **sh**: dimensions sorted in loop order.\n* - **sx**: first input ndarray strides sorted in loop order.\n* - **sy**: second input ndarray strides sorted in loop order.\n* - **sz**: output ndarray strides sorted in loop order.\n*\n* @param {NonNegativeIntegerArray} sh - array dimensions\n* @param {IntegerArray} sx - first input array stride lengths\n* @param {IntegerArray} sy - second input array stride lengths\n* @param {IntegerArray} sz - output array stride lengths\n* @returns {Object} loop interchange data\n*\n* @example\n* var sh = [ 2, 3, 4 ];\n*\n* var sx = [ 12, 4, 1 ]; // row-major\n* var sy = [ 24, 8, 1 ]; // row-major\n* var sz = [ 1, -2, 6 ]; // column-major\n*\n* var o = loopOrder( sh, sx, sy, sz );\n* // returns {...}\n*\n* var ssh = o.sh;\n* // returns [ 4, 3, 2 ]\n*\n* var ssx = o.sx;\n* // returns [ 1, 4, 12 ]\n*\n* var ssy = o.sy;\n* // returns [ 1, 8, 24 ]\n*\n* var ssz = o.sz;\n* // returns [ 6, -2, 1 ]\n*/\nfunction loopOrder( sh, sx, sy, sz ) {\n\tvar idx;\n\tvar tmp;\n\tvar max;\n\tvar len;\n\tvar arr;\n\tvar ox;\n\tvar oy;\n\tvar oz;\n\tvar i;\n\tvar j;\n\n\t// Initialize a loop interchange index array for generating a loop order permutation:\n\tidx = zeroTo( sh.length );\n\n\t// Determine the order (layout) of each array:\n\tox = strides2order( sx );\n\toy = strides2order( sy );\n\toz = strides2order( sz );\n\n\t// Determine which array should be used to generate the loop order:\n\ttmp = [ [], [], [], [] ];\n\ttmp[ ox ].push( sx );\n\ttmp[ oy ].push( sy );\n\ttmp[ oz ].push( sz );\n\tmax = tmp[ 0 ].length;\n\tif ( max === N ) {\n\t\t// If all arrays are \"disorganized\", then just use the first array, as, generally, each array is likely to be as un-ideal as every other:\n\t\tarr = sx;\n\t} else if ( max === N-1 ) {\n\t\t// If all but one array is \"disorganized\", find the \"organized\" array...\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tif ( tmp[ i ].length ) {\n\t\t\t\tarr = tmp[ i ][ 0 ];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// Find the layout which is most common...\n\t\tj = 0;\n\t\tfor ( i = 1; i < 4; i++ ) {\n\t\t\tlen = tmp[ i ].length;\n\t\t\tif ( len >= max ) {\n\t\t\t\tmax = len;\n\t\t\t\tj = i;\n\t\t\t}\n\t\t}\n\t\t// Use the strides of the first array having the most common layout:\n\t\tarr = tmp[ j ][ 0 ];\n\t}\n\t// Sort array strides in increasing order (of magnitude):\n\tarr = copy( arr );\n\tsort2ins( arr, idx );\n\n\t// Permute the shape and array strides based on the sorted strides:\n\tsh = take( sh, idx );\n\tsx = take( sx, idx );\n\tsy = take( sy, idx );\n\tsz = take( sz, idx );\n\n\treturn {\n\t\t'sh': sh,\n\t\t'sx': sx,\n\t\t'sy': sy,\n\t\t'sz': sz\n\t};\n}\n\n\n// EXPORTS //\n\nexport default loopOrder;\n","/**\n* @license Apache-2.0\n*\n* Copyright (c) 2023 The Stdlib Authors.\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n'use strict';\n\n// MAIN //\n\n/**\n* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort.\n*\n* ## Notes\n*\n* - The first array is sorted in increasing order according to absolute value.\n* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`.\n* - The algorithm is efficient for small arrays (typically `N <= 20`) and is particularly efficient for sorting arrays which are already substantially sorted.\n* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent.\n* - The input arrays are sorted in-place (i.e., the input arrays are mutated).\n*\n* @private\n* @param {Array} x - first array\n* @param {Array} y - second array\n* @returns {void}\n*\n* @example\n* var x = [ -4, -2, 3, 1 ];\n* var y = [ 0, 1, 2, 3 ];\n*\n* sort2ins( x, y );\n*\n* console.log( x );\n* // => [ 1, -2, 3, -4 ]\n*\n* console.log( y );\n* // => [ 3, 1, 2, 0 ]\n*/\nfunction sort2ins( x, y ) {\n\tvar avx;\n\tvar aux;\n\tvar ix;\n\tvar iy;\n\tvar jx;\n\tvar jy;\n\tvar vx;\n\tvar vy;\n\tvar ux;\n\tvar i;\n\n\tix = 1;\n\tiy = 1;\n\n\t// Sort in increasing order...\n\tfor ( i = 1; i < x.length; i++ ) {\n\t\tvx = x[ ix ];\n\t\tavx = ( vx < 0 ) ? -vx : vx;\n\n\t\tvy = y[ iy ];\n\n\t\tjx = ix - 1;\n\t\tjy = iy - 1;\n\n\t\t// Shift all larger values to the left of the current element to the right...\n\t\twhile ( jx >= 0 ) {\n\t\t\tux = x[ jx ];\n\t\t\taux = ( ux < 0 ) ? -ux : ux;\n\t\t\tif ( aux <= avx ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tx[ jx+1 ] = ux;\n\t\t\ty[ jy+1 ] = y[ jy ];\n\t\t\tjx -= 1;\n\t\t\tjy -= 1;\n\t\t}\n\t\tx[ jx+1 ] = vx;\n\t\ty[ jy+1 ] = vy;\n\t\tix += 1;\n\t\tiy += 1;\n\t}\n}\n\n\n// EXPORTS //\n\nexport default sort2ins;\n"],"names":["loopOrder","sh","sx","sy","sz","idx","tmp","max","len","arr","ox","oy","oz","i","j","zeroTo","length","strides2order","push","N","x","y","avx","ix","iy","jx","jy","vx","vy","ux","sort2ins","copy","take"],"mappings":";;sYA6EA,SAASA,EAAWC,EAAIC,EAAIC,EAAIC,GAC/B,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAgBJ,GAbAT,EAAMU,EAAQd,EAAGe,QAGjBN,EAAKO,EAAef,GACpBS,EAAKM,EAAed,GACpBS,EAAKK,EAAeb,IAGpBE,EAAM,CAAE,GAAI,GAAI,GAAI,KACfI,GAAKQ,KAAMhB,GAChBI,EAAKK,GAAKO,KAAMf,GAChBG,EAAKM,GAAKM,KAAMd,GArET,KAsEPG,EAAMD,EAAK,GAAIU,QAGdP,EAAMP,OACA,GAAaiB,IAARZ,GAEX,IAAMM,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAKP,EAAKO,GAAIG,OAAS,CACtBP,EAAMH,EAAKO,GAAK,GAChB,KACA,MAEI,CAGN,IADAC,EAAI,EACED,EAAI,EAAGA,EAAI,EAAGA,KACnBL,EAAMF,EAAKO,GAAIG,SACHT,IACXA,EAAMC,EACNM,EAAID,GAINJ,EAAMH,EAAKQ,GAAK,EAChB,CAWD,OCvFD,SAAmBM,EAAGC,GACrB,IAAIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAhB,EAMJ,IAJAU,EAAK,EACLC,EAAK,EAGCX,EAAI,EAAGA,EAAIO,EAAEJ,OAAQH,IAAM,CAUhC,IARAS,GADAK,EAAKP,EAAGG,IACK,GAAOI,EAAKA,EAEzBC,EAAKP,EAAGG,GAERC,EAAKF,EAAK,EACVG,EAAKF,EAAK,EAGFC,GAAM,OACbI,EAAKT,EAAGK,IACK,GAAOI,EAAKA,IACbP,IAGZF,EAAGK,EAAG,GAAMI,EACZR,EAAGK,EAAG,GAAML,EAAGK,GACfD,GAAM,EACNC,GAAM,EAEPN,EAAGK,EAAG,GAAME,EACZN,EAAGK,EAAG,GAAME,EACZL,GAAM,EACNC,GAAM,CACN,CACF,CDqCCM,CADArB,EAAMsB,EAAMtB,GACGJ,GAQR,CACNJ,GANDA,EAAK+B,EAAM/B,EAAII,GAOdH,GANDA,EAAK8B,EAAM9B,EAAIG,GAOdF,GANDA,EAAK6B,EAAM7B,EAAIE,GAOdD,GANDA,EAAK4B,EAAM5B,EAAIC,GAQhB"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 1d08fef..0000000 --- a/lib/index.js +++ /dev/null @@ -1,58 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -/** -* Reorder ndarray dimensions and associated strides for loop interchange. -* -* @module @stdlib/ndarray-base-binary-loop-interchange-order -* -* @example -* var binaryLoopOrder = require( '@stdlib/ndarray-base-binary-loop-interchange-order' ); -* -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ - -// MODULES // - -var main = require( './main.js' ); - - -// EXPORTS // - -module.exports = main; diff --git a/lib/main.js b/lib/main.js deleted file mode 100644 index 41c2b62..0000000 --- a/lib/main.js +++ /dev/null @@ -1,149 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var zeroTo = require( '@stdlib/array-base-zero-to' ); -var copy = require( '@stdlib/array-base-copy-indexed' ); -var take = require( '@stdlib/array-base-take-indexed' ); -var strides2order = require( '@stdlib/ndarray-base-strides2order' ); -var sort2ins = require( './sort2ins.js' ); - - -// VARIABLES // - -// Number of arrays: -var N = 3; - - -// MAIN // - -/** -* Reorders ndarray dimensions and associated strides for loop interchange. -* -* ## Notes -* -* - The returned object has the following properties: -* -* - **sh**: dimensions sorted in loop order. -* - **sx**: first input ndarray strides sorted in loop order. -* - **sy**: second input ndarray strides sorted in loop order. -* - **sz**: output ndarray strides sorted in loop order. -* -* @param {NonNegativeIntegerArray} sh - array dimensions -* @param {IntegerArray} sx - first input array stride lengths -* @param {IntegerArray} sy - second input array stride lengths -* @param {IntegerArray} sz - output array stride lengths -* @returns {Object} loop interchange data -* -* @example -* var sh = [ 2, 3, 4 ]; -* -* var sx = [ 12, 4, 1 ]; // row-major -* var sy = [ 24, 8, 1 ]; // row-major -* var sz = [ 1, -2, 6 ]; // column-major -* -* var o = loopOrder( sh, sx, sy, sz ); -* // returns {...} -* -* var ssh = o.sh; -* // returns [ 4, 3, 2 ] -* -* var ssx = o.sx; -* // returns [ 1, 4, 12 ] -* -* var ssy = o.sy; -* // returns [ 1, 8, 24 ] -* -* var ssz = o.sz; -* // returns [ 6, -2, 1 ] -*/ -function loopOrder( sh, sx, sy, sz ) { - var idx; - var tmp; - var max; - var len; - var arr; - var ox; - var oy; - var oz; - var i; - var j; - - // Initialize a loop interchange index array for generating a loop order permutation: - idx = zeroTo( sh.length ); - - // Determine the order (layout) of each array: - ox = strides2order( sx ); - oy = strides2order( sy ); - oz = strides2order( sz ); - - // Determine which array should be used to generate the loop order: - tmp = [ [], [], [], [] ]; - tmp[ ox ].push( sx ); - tmp[ oy ].push( sy ); - tmp[ oz ].push( sz ); - max = tmp[ 0 ].length; - if ( max === N ) { - // If all arrays are "disorganized", then just use the first array, as, generally, each array is likely to be as un-ideal as every other: - arr = sx; - } else if ( max === N-1 ) { - // If all but one array is "disorganized", find the "organized" array... - for ( i = 1; i < 4; i++ ) { - if ( tmp[ i ].length ) { - arr = tmp[ i ][ 0 ]; - break; - } - } - } else { - // Find the layout which is most common... - j = 0; - for ( i = 1; i < 4; i++ ) { - len = tmp[ i ].length; - if ( len >= max ) { - max = len; - j = i; - } - } - // Use the strides of the first array having the most common layout: - arr = tmp[ j ][ 0 ]; - } - // Sort array strides in increasing order (of magnitude): - arr = copy( arr ); - sort2ins( arr, idx ); - - // Permute the shape and array strides based on the sorted strides: - sh = take( sh, idx ); - sx = take( sx, idx ); - sy = take( sy, idx ); - sz = take( sz, idx ); - - return { - 'sh': sh, - 'sx': sx, - 'sy': sy, - 'sz': sz - }; -} - - -// EXPORTS // - -module.exports = loopOrder; diff --git a/lib/sort2ins.js b/lib/sort2ins.js deleted file mode 100644 index 8dc9841..0000000 --- a/lib/sort2ins.js +++ /dev/null @@ -1,98 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MAIN // - -/** -* Simultaneously sorts two arrays based on the sort order of the first array using insertion sort. -* -* ## Notes -* -* - The first array is sorted in increasing order according to absolute value. -* - The algorithm has space complexity `O(1)` and worst case time complexity `O(N^2)`. -* - The algorithm is efficient for small arrays (typically `N <= 20`) and is particularly efficient for sorting arrays which are already substantially sorted. -* - The algorithm is **stable**, meaning that the algorithm does **not** change the order of array elements which are equal or equivalent. -* - The input arrays are sorted in-place (i.e., the input arrays are mutated). -* -* @private -* @param {Array} x - first array -* @param {Array} y - second array -* @returns {void} -* -* @example -* var x = [ -4, -2, 3, 1 ]; -* var y = [ 0, 1, 2, 3 ]; -* -* sort2ins( x, y ); -* -* console.log( x ); -* // => [ 1, -2, 3, -4 ] -* -* console.log( y ); -* // => [ 3, 1, 2, 0 ] -*/ -function sort2ins( x, y ) { - var avx; - var aux; - var ix; - var iy; - var jx; - var jy; - var vx; - var vy; - var ux; - var i; - - ix = 1; - iy = 1; - - // Sort in increasing order... - for ( i = 1; i < x.length; i++ ) { - vx = x[ ix ]; - avx = ( vx < 0 ) ? -vx : vx; - - vy = y[ iy ]; - - jx = ix - 1; - jy = iy - 1; - - // Shift all larger values to the left of the current element to the right... - while ( jx >= 0 ) { - ux = x[ jx ]; - aux = ( ux < 0 ) ? -ux : ux; - if ( aux <= avx ) { - break; - } - x[ jx+1 ] = ux; - y[ jy+1 ] = y[ jy ]; - jx -= 1; - jy -= 1; - } - x[ jx+1 ] = vx; - y[ jy+1 ] = vy; - ix += 1; - iy += 1; - } -} - - -// EXPORTS // - -module.exports = sort2ins; diff --git a/package.json b/package.json index fae2094..edc218a 100644 --- a/package.json +++ b/package.json @@ -3,31 +3,8 @@ "version": "0.2.2", "description": "Reorder ndarray dimensions and associated strides for loop interchange.", "license": "Apache-2.0", - "author": { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - }, - "contributors": [ - { - "name": "The Stdlib Authors", - "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" - } - ], - "main": "./lib", - "directories": { - "benchmark": "./benchmark", - "doc": "./docs", - "example": "./examples", - "lib": "./lib", - "test": "./test" - }, - "types": "./docs/types", - "scripts": { - "test": "make test", - "test-cov": "make test-cov", - "examples": "make examples", - "benchmark": "make benchmark" - }, + "type": "module", + "main": "./index.mjs", "homepage": "https://stdlib.io", "repository": { "type": "git", @@ -36,39 +13,6 @@ "bugs": { "url": "https://github.com/stdlib-js/stdlib/issues" }, - "dependencies": { - "@stdlib/array-base-copy-indexed": "^0.2.2", - "@stdlib/array-base-take-indexed": "^0.2.2", - "@stdlib/array-base-zero-to": "^0.2.1", - "@stdlib/ndarray-base-strides2order": "^0.2.2", - "@stdlib/types": "^0.4.3", - "@stdlib/error-tools-fmtprodmsg": "^0.2.2" - }, - "devDependencies": { - "@stdlib/assert-is-array": "^0.2.2", - "@stdlib/ndarray-array": "^0.2.1", - "@stdlib/ndarray-base-shape2strides": "^0.2.2", - "@stdlib/random-base-randu": "^0.2.1", - "tape": "git+https://github.com/kgryte/tape.git#fix/globby", - "istanbul": "^0.4.1", - "tap-min": "git+https://github.com/Planeshifter/tap-min.git", - "@stdlib/bench-harness": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">2.7.0" - }, - "os": [ - "aix", - "darwin", - "freebsd", - "linux", - "macos", - "openbsd", - "sunos", - "win32", - "windows" - ], "keywords": [ "stdlib", "stdtypes", @@ -90,9 +34,8 @@ "utils", "util" ], - "__stdlib__": {}, "funding": { "type": "opencollective", "url": "https://opencollective.com/stdlib" } -} \ No newline at end of file +} diff --git a/stats.html b/stats.html new file mode 100644 index 0000000..5f60aa7 --- /dev/null +++ b/stats.html @@ -0,0 +1,4842 @@ + + + + + + + + Rollup Visualizer + + + +
+ + + + + diff --git a/test/dist/test.js b/test/dist/test.js deleted file mode 100644 index a8a9c60..0000000 --- a/test/dist/test.js +++ /dev/null @@ -1,33 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var main = require( './../../dist' ); - - -// TESTS // - -tape( 'main export is defined', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( main !== void 0, true, 'main export is defined' ); - t.end(); -}); diff --git a/test/test.js b/test/test.js deleted file mode 100644 index 7d30dd7..0000000 --- a/test/test.js +++ /dev/null @@ -1,208 +0,0 @@ -/** -* @license Apache-2.0 -* -* Copyright (c) 2023 The Stdlib Authors. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -'use strict'; - -// MODULES // - -var tape = require( 'tape' ); -var isArray = require( '@stdlib/assert-is-array' ); -var loopOrder = require( './../lib' ); - - -// TESTS // - -tape( 'main export is a function', function test( t ) { - t.ok( true, __filename ); - t.strictEqual( typeof loopOrder, 'function', 'main export is a function' ); - t.end(); -}); - -tape( 'the function returns loop interchange data (row-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ -4, 2, 1 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (column-major)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 1, -4, 8 ]; - sy = [ -1, 4, 8 ]; - sz = [ -2, 4, -8 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 4, 2, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -4, 8 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -1, 4, 8 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mixed order)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ 4, -2, 1 ]; - sy = [ 1, -4, -8 ]; - sz = [ -8, 4, -2 ]; - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ -8, -4, 1 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ -2, 4, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (mostly disorganized)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ -2, 4, 1 ]; // disorganized - sy = [ -4, 2, 1 ]; // row-major - sz = [ -8, -2, 4 ]; // disorganized - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 2, 4 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, 4, -2 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 1, 2, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ 4, -2, -8 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'the function returns loop interchange data (all disorganized)', function test( t ) { - var sh; - var sx; - var sy; - var sz; - var o; - - sh = [ 4, 2, 2 ]; - sx = [ -2, 4, 1 ]; // disorganized - sy = [ 1, -4, 2 ]; // disorganized - sz = [ -8, -2, 4 ]; // disorganized - - o = loopOrder( sh, sx, sy, sz ); - - t.notEqual( o.sh, sh, 'returns new array' ); - t.strictEqual( isArray( o.sh ), true, 'returns expected value' ); - t.deepEqual( o.sh, [ 2, 4, 2 ], 'returns expected value' ); - - t.notEqual( o.sx, sx, 'returns new array' ); - t.strictEqual( isArray( o.sx ), true, 'returns expected value' ); - t.deepEqual( o.sx, [ 1, -2, 4 ], 'returns expected value' ); - - t.notEqual( o.sy, sy, 'returns new array' ); - t.strictEqual( isArray( o.sy ), true, 'returns expected value' ); - t.deepEqual( o.sy, [ 2, 1, -4 ], 'returns expected value' ); - - t.notEqual( o.sz, sz, 'returns new array' ); - t.strictEqual( isArray( o.sz ), true, 'returns expected value' ); - t.deepEqual( o.sz, [ 4, -8, -2 ], 'returns expected value' ); - - t.end(); -}); - -tape( 'if provided empty arrays, the function returns empty arrays', function test( t ) { - var o = loopOrder( [], [], [], [] ); - t.deepEqual( o.sh, [], 'returns expected value' ); - t.deepEqual( o.sx, [], 'returns expected value' ); - t.deepEqual( o.sy, [], 'returns expected value' ); - t.deepEqual( o.sz, [], 'returns expected value' ); - t.end(); -});