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 6a11ba9..0000000
--- a/.github/.keepalive
+++ /dev/null
@@ -1 +0,0 @@
-2025-08-18T01:07:16.101Z
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index c8c532b..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/broadcast-shapes) 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 a07d970..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/broadcast-shapes) 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 7292af0..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: '0 12 * * 5'
-
- # 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
+```
-```javascript
-var broadcastShapes = require( '@stdlib/ndarray-base-broadcast-shapes' );
+If no recognized module system is present, access bundle contents via the global scope:
+
+```html
+
```
#### broadcastShapes( shapes )
@@ -245,9 +251,14 @@ var sh = broadcastShapes( [ sh1, sh2 ] );
-```javascript
-var lpad = require( '@stdlib/string-left-pad' );
-var broadcastShapes = require( '@stdlib/ndarray-base-broadcast-shapes' );
+```html
+
+
+
+
+
+
+
+
```
@@ -288,131 +304,7 @@ for ( i = 0; i < shapes.length; i++ ) {
-* * *
-
-
-
-## C APIs
-
-
-
-
-
-
-
-
-
-
-
-### Usage
-
-```c
-#include "stdlib/ndarray/base/broadcast_shapes.h"
-```
-
-#### stdlib_ndarray_broadcast_shapes( M, \*\*shapes, \*ndims, \*out )
-
-Broadcasts array shapes to a single shape.
-
-```c
-#include "stdlib/ndarray/base/broadcast_shapes.h"
-#include
-
-int64_t N1 = 4;
-int64_t sh1[] = { 8, 1, 6, 1 };
-
-int64_t N2 = 3;
-int64_t sh2[] = { 7, 1, 5 };
-
-int64_t ndims[] = { N1, N2 };
-int64_t *shapes[] = { sh1, sh2 };
-
-int64_t out[] = { 0, 0, 0, 0 };
-int8_t status = stdlib_ndarray_broadcast_shapes( 2, shapes, ndims, out );
-if ( status != 0 ) {
- // Handle error...
-}
-```
-
-The function accepts the following arguments:
-
-- **M**: `[in] int64_t` number of shape arrays.
-- **shapes**: `[in] int64_t**` array of shape arrays (dimensions).
-- **ndims**: `[in] int64_t*` number of dimensions for each respective shape array.
-- **out**: `[out] int64_t*` output shape array.
-
-```c
-int8_t stdlib_ndarray_broadcast_shapes( const int64_t M, const int64_t *shapes[], const int64_t ndims[], int64_t *out );
-```
-
-If successful, the function returns `0`; otherwise, the function returns `-1` (e.g., due to incompatible shapes).
-
-
-
-
-
-
-
-
-
-### Notes
-
-- Even if the function is unsuccessful, the function may still overwrite elements in the output array before returning. In other words, do not assume that providing incompatible shapes is a no-op with regard to the output array.
-
-
-
-
-
-
-
-
-
-### Examples
-
-```c
-#include "stdlib/ndarray/base/broadcast_shapes.h"
-#include
-#include
-#include
-
-int main( void ) {
- int64_t N1 = 4;
- int64_t sh1[] = { 8, 1, 6, 1 };
-
- int64_t N2 = 3;
- int64_t sh2[] = { 7, 1, 5 };
-
- int64_t ndims[] = { N1, N2 };
- int64_t *shapes[] = { sh1, sh2 };
-
- int64_t out[] = { 0, 0, 0, 0 };
- int8_t status = stdlib_ndarray_broadcast_shapes( 2, shapes, ndims, out );
- if ( status != 0 ) {
- printf( "incompatible shapes\n" );
- return 1;
- }
- int64_t i;
- printf( "shape = ( " );
- for ( i = 0; i < N1; i++ ) {
- printf( "%"PRId64"", out[ i ] );
- if ( i < N1-1 ) {
- printf( ", " );
- }
- }
- printf( " )\n" );
- return 0;
-}
-```
-
-
-
-
-
-
-
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 6426216..0000000
--- a/benchmark/benchmark.js
+++ /dev/null
@@ -1,112 +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.
-*/
-
-'use strict';
-
-// MODULES //
-
-var bench = require( '@stdlib/bench-harness' );
-var pkg = require( './../package.json' ).name;
-var broadcastShapes = require( './../lib' );
-
-
-// MAIN //
-
-bench( pkg+'::two_shapes', function benchmark( b ) {
- var values;
- var out;
- var i;
-
- values = [
- [ [ 8, 1, 6, 1 ], [ 7, 1, 5 ] ],
- [ [ 3, 2 ], [ 3, 1 ] ],
- [ [ 1, 1 ], [ 2, 2 ] ],
- [ [ 1 ], [ 7 ] ],
- [ [ 1, 1, 1, 1, 1 ], [ 5, 5, 5, 5, 5 ] ]
- ];
-
- b.tic();
- for ( i = 0; i < b.iterations; i++ ) {
- out = broadcastShapes( values[ i%values.length ] );
- if ( out === null || out[ out.length-1 ] !== out[ out.length-1 ] ) {
- b.fail( 'something went wrong' );
- }
- }
- b.toc();
- if ( out === null || out[ out.length-1 ] !== out[ out.length-1 ] ) {
- b.fail( 'something went wrong' );
- }
- b.pass( 'benchmark finished' );
- b.end();
-});
-
-bench( pkg+'::three_shapes', function benchmark( b ) {
- var values;
- var out;
- var i;
-
- values = [
- [ [ 8, 1, 6, 1 ], [ 7, 1, 5 ], [ 1, 1 ] ],
- [ [ 3, 2 ], [ 3, 1 ], [ 3, 2 ] ],
- [ [ 1, 1 ], [ 2, 2 ], [ 2, 1, 2 ] ],
- [ [ 1 ], [ 7 ], [ 7 ] ],
- [ [ 1, 1, 1, 1, 1 ], [ 5, 5, 5, 5, 5 ], [ 5 ] ]
- ];
-
- b.tic();
- for ( i = 0; i < b.iterations; i++ ) {
- out = broadcastShapes( values[ i%values.length ] );
- if ( out === null || out[ out.length-1 ] !== out[ out.length-1 ] ) {
- b.fail( 'something went wrong' );
- }
- }
- b.toc();
- if ( out === null || out[ out.length-1 ] !== out[ out.length-1 ] ) {
- b.fail( 'something went wrong' );
- }
- b.pass( 'benchmark finished' );
- b.end();
-});
-
-bench( pkg+'::four_shapes', function benchmark( b ) {
- var values;
- var out;
- var i;
-
- values = [
- [ [ 8, 1, 6, 1 ], [ 7, 1, 5 ], [ 1, 1 ], [ 8, 1, 1, 1 ] ],
- [ [ 3, 2 ], [ 3, 1 ], [ 3, 2 ], [ 1, 3, 2 ] ],
- [ [ 1, 1 ], [ 2, 2 ], [ 2, 1, 2 ], [ 1, 1, 2, 2 ] ],
- [ [ 1 ], [ 7 ], [ 7 ], [ 1 ] ],
- [ [ 1, 1, 1, 1, 1 ], [ 5, 5, 5, 5, 5 ], [ 5 ], [ 5, 1, 5 ] ]
- ];
-
- b.tic();
- for ( i = 0; i < b.iterations; i++ ) {
- out = broadcastShapes( values[ i%values.length ] );
- if ( out === null || out[ out.length-1 ] !== out[ out.length-1 ] ) {
- b.fail( 'something went wrong' );
- }
- }
- b.toc();
- if ( out === null || out[ out.length-1 ] !== out[ out.length-1 ] ) {
- b.fail( 'something went wrong' );
- }
- b.pass( 'benchmark finished' );
- b.end();
-});
diff --git a/benchmark/c/Makefile b/benchmark/c/Makefile
deleted file mode 100644
index 5dc545c..0000000
--- a/benchmark/c/Makefile
+++ /dev/null
@@ -1,146 +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.
-#/
-
-# VARIABLES #
-
-ifndef VERBOSE
- QUIET := @
-else
- QUIET :=
-endif
-
-# Determine the OS ([1][1], [2][2]).
-#
-# [1]: https://en.wikipedia.org/wiki/Uname#Examples
-# [2]: http://stackoverflow.com/a/27776822/2225624
-OS ?= $(shell uname)
-ifneq (, $(findstring MINGW,$(OS)))
- OS := WINNT
-else
-ifneq (, $(findstring MSYS,$(OS)))
- OS := WINNT
-else
-ifneq (, $(findstring CYGWIN,$(OS)))
- OS := WINNT
-else
-ifneq (, $(findstring Windows_NT,$(OS)))
- OS := WINNT
-endif
-endif
-endif
-endif
-
-# Define the program used for compiling C source files:
-ifdef C_COMPILER
- CC := $(C_COMPILER)
-else
- CC := gcc
-endif
-
-# Define the command-line options when compiling C files:
-CFLAGS ?= \
- -std=c99 \
- -O3 \
- -Wall \
- -pedantic
-
-# Determine whether to generate position independent code ([1][1], [2][2]).
-#
-# [1]: https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options
-# [2]: http://stackoverflow.com/questions/5311515/gcc-fpic-option
-ifeq ($(OS), WINNT)
- fPIC ?=
-else
- fPIC ?= -fPIC
-endif
-
-# List of includes (e.g., `-I /foo/bar -I /beep/boop/include`):
-INCLUDE ?=
-
-# List of source files:
-SOURCE_FILES ?=
-
-# List of libraries (e.g., `-lopenblas -lpthread`):
-LIBRARIES ?=
-
-# List of library paths (e.g., `-L /foo/bar -L /beep/boop`):
-LIBPATH ?=
-
-# List of C targets:
-c_targets := benchmark.out
-
-
-# RULES #
-
-#/
-# Compiles C source files.
-#
-# @param {string} SOURCE_FILES - list of C source files
-# @param {string} [INCLUDE] - list of includes (e.g., `-I /foo/bar -I /beep/boop`)
-# @param {string} [LIBRARIES] - list of libraries (e.g., `-lpthread -lblas`)
-# @param {string} [LIBPATH] - list of library paths (e.g., `-L /foo/bar -L /beep/boop`)
-# @param {string} [C_COMPILER] - C compiler
-# @param {string} [CFLAGS] - C compiler flags
-# @param {(string|void)} [fPIC] - compiler flag indicating whether to generate position independent code
-#
-# @example
-# make
-#
-# @example
-# make all
-#/
-all: $(c_targets)
-
-.PHONY: all
-
-#/
-# Compiles C source files.
-#
-# @private
-# @param {string} SOURCE_FILES - list of C source files
-# @param {(string|void)} INCLUDE - list of includes (e.g., `-I /foo/bar -I /beep/boop`)
-# @param {(string|void)} LIBRARIES - list of libraries (e.g., `-lpthread -lblas`)
-# @param {(string|void)} LIBPATH - list of library paths (e.g., `-L /foo/bar -L /beep/boop`)
-# @param {string} CC - C compiler
-# @param {string} CFLAGS - C compiler flags
-# @param {(string|void)} fPIC - compiler flag indicating whether to generate position independent code
-#/
-$(c_targets): %.out: %.c
- $(QUIET) $(CC) $(CFLAGS) $(fPIC) $(INCLUDE) -o $@ $(SOURCE_FILES) $< $(LIBPATH) -lm $(LIBRARIES)
-
-#/
-# Runs compiled benchmarks.
-#
-# @example
-# make run
-#/
-run: $(c_targets)
- $(QUIET) ./$<
-
-.PHONY: run
-
-#/
-# Removes generated files.
-#
-# @example
-# make clean
-#/
-clean:
- $(QUIET) -rm -f *.o *.out
-
-.PHONY: clean
diff --git a/benchmark/c/benchmark.c b/benchmark/c/benchmark.c
deleted file mode 100644
index 82d2be5..0000000
--- a/benchmark/c/benchmark.c
+++ /dev/null
@@ -1,149 +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.
-*/
-
-#include "stdlib/ndarray/base/broadcast_shapes.h"
-#include
-#include
-#include
-#include
-#include
-#include
-
-#define NAME "broadcast-shapes"
-#define ITERATIONS 1000000
-#define REPEATS 3
-
-/**
-* Prints the TAP version.
-*/
-static void print_version( void ) {
- printf( "TAP version 13\n" );
-}
-
-/**
-* Prints the TAP summary.
-*
-* @param total total number of tests
-* @param passing total number of passing tests
-*/
-static void print_summary( int total, int passing ) {
- printf( "#\n" );
- printf( "1..%d\n", total ); // TAP plan
- printf( "# total %d\n", total );
- printf( "# pass %d\n", passing );
- printf( "#\n" );
- printf( "# ok\n" );
-}
-
-/**
-* Prints benchmarks results.
-*
-* @param elapsed elapsed time in seconds
-*/
-static void print_results( double elapsed ) {
- double rate = (double)ITERATIONS / elapsed;
- printf( " ---\n" );
- printf( " iterations: %d\n", ITERATIONS );
- printf( " elapsed: %0.9f\n", elapsed );
- printf( " rate: %0.9f\n", rate );
- printf( " ...\n" );
-}
-
-/**
-* Returns a clock time.
-*
-* @return clock time
-*/
-static double tic( void ) {
- struct timeval now;
- gettimeofday( &now, NULL );
- return (double)now.tv_sec + (double)now.tv_usec/1.0e6;
-}
-
-/**
-* Generates a random number on the interval [0,1).
-*
-* @return random number
-*/
-static double rand_double( void ) {
- int r = rand();
- return (double)r / ( (double)RAND_MAX + 1.0 );
-}
-
-/**
-* Runs a benchmark.
-*
-* @return elapsed time in seconds
-*/
-static double benchmark( void ) {
- double elapsed;
- int8_t status;
- double t;
- int i;
-
- const int64_t sh1[] = { 8, 1, 6, 1 };
- const int64_t sh2[] = { 7, 1, 5 };
-
- const int64_t ndims[] = { 4, 3 };
- const int64_t *shapes[] = { sh1, sh2 };
-
- int64_t out[] = { 0, 0, 0, 0 };
-
- t = tic();
- for ( i = 0; i < ITERATIONS; i++ ) {
- status = stdlib_ndarray_broadcast_shapes( 2, shapes, ndims, out );
- if ( status != 0 ) {
- printf( "unexpected result\n" );
- break;
- }
- }
- elapsed = tic() - t;
- if ( out[ 0 ] != 8 ) {
- printf( "unexpected result\n" );
- }
- if ( out[ 1 ] != 7 ) {
- printf( "unexpected result\n" );
- }
- if ( out[ 2 ] != 6 ) {
- printf( "unexpected result\n" );
- }
- if ( out[ 3 ] != 5 ) {
- printf( "unexpected result\n" );
- }
- return elapsed;
-}
-
-/**
-* Main execution sequence.
-*/
-int main( void ) {
- double elapsed;
- int i;
-
- // Use the current time to seed the random number generator:
- srand( time( NULL ) );
-
- print_version();
- for ( i = 0; i < REPEATS; i++ ) {
- printf( "# c::native::%s::two_arrays\n", NAME );
- elapsed = benchmark();
- print_results( elapsed );
- printf( "ok %d benchmark finished\n", i+1 );
- }
- print_summary( REPEATS, REPEATS );
-}
diff --git a/branches.md b/branches.md
deleted file mode 100644
index 79909c9..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/broadcast-shapes"
-%% click B href "https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/main"
-%% click C href "https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/production"
-%% click D href "https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/esm"
-%% click E href "https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/deno"
-%% click F href "https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/umd"
-```
-
-[stdlib-url]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/ndarray/base/broadcast-shapes
-[production-url]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/production
-[deno-url]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/deno
-[deno-readme]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/blob/deno/README.md
-[umd-url]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/umd
-[umd-readme]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/blob/umd/README.md
-[esm-url]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/tree/esm
-[esm-readme]: https://github.com/stdlib-js/ndarray-base-broadcast-shapes/blob/esm/README.md
\ No newline at end of file
diff --git a/browser.js b/browser.js
new file mode 100644
index 0000000..14405dc
--- /dev/null
+++ b/browser.js
@@ -0,0 +1,3 @@
+// Copyright (c) 2025 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0
+var e,f;e=this,f=function(){"use strict";return function(e){var f,n,t,r,o,u,i,s,l,d,h;if(n=[],0===(s=e.length))return n;if(l=(r=e[0]).length,1===s){for(d=0;dl&&(l=f[d]);for(d=0;d=0;){for(t=(o=f[0]-l+d)>=0?r[o]:1,h=1;h=0?e[h][u]:1,1!==t){if(1!==i&&t!==i)return null}else t=i;n[d]=t,d-=1}return n}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define(f):(e="undefined"!=typeof globalThis?globalThis:e||self).broadcastShapes=f();
+//# sourceMappingURL=browser.js.map
diff --git a/browser.js.map b/browser.js.map
new file mode 100644
index 0000000..aa4b2bb
--- /dev/null
+++ b/browser.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"browser.js","sources":["../lib/main.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2021 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* Broadcasts array shapes to a single shape.\n*\n* ## Notes\n*\n* - Two respective dimensions in two shape arrays are compatible if\n*\n* 1. the dimensions are equal.\n* 2. one dimension is `1`.\n*\n* - The function returns `null` if provided incompatible shapes (i.e., shapes which cannot be broadcast with one another).\n*\n* @param {Array} shapes - array of shape arrays\n* @returns {(NonNegativeIntegerArray|null)} broadcast shape (or `null`)\n*\n* @example\n* var shapes = [\n* [ 8, 1, 6, 1 ],\n* [ 7, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 7, 6, 5 ]\n*\n* @example\n* var shapes = [\n* [ 5, 4 ],\n* [ 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 5, 4 ]\n*\n* @example\n* var shapes = [\n* [ 5, 4 ],\n* [ 4 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 5, 4 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 15, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 3, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 3, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 1, 7, 1, 5 ],\n* [ 8, 4, 1, 6, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 4, 7, 6, 5 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 0 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 1, 1, 6, 0 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 8, 0, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 0, 1, 6, 1 ]\n*\n* @example\n* var shapes = [\n* [ 8, 8, 1, 6, 1 ],\n* [ 8, 0, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns null\n*\n* @example\n* var shapes = [\n* [ 8, 0, 1, 6, 1 ],\n* [ 8, 8, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns null\n*\n* @example\n* var shapes = [\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [\n* [],\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [\n* [ 3, 2, 1 ],\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 3, 2, 1 ]\n*\n* @example\n* var shapes = [\n* [],\n* [ 3, 2, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 3, 2, 1 ]\n*/\nfunction broadcastShapes( shapes ) {\n\tvar ndims;\n\tvar out;\n\tvar dim;\n\tvar sh;\n\tvar n1;\n\tvar n2;\n\tvar d;\n\tvar M;\n\tvar N;\n\tvar i;\n\tvar j;\n\n\tM = shapes.length;\n\tout = [];\n\tif ( M === 0 ) {\n\t\treturn out;\n\t}\n\tsh = shapes[ 0 ];\n\tN = sh.length;\n\n\t// If provided a single input shape array, then the broadcast shape is input shape...\n\tif ( M === 1 ) {\n\t\t// Need to manually copy to output shape, as shapes could be array-like objects...\n\t\tfor ( i = 0; i < N; i++ ) {\n\t\t\tout.push( sh[ i ] );\n\t\t}\n\t\treturn out;\n\t}\n\t// Determine the maximum dimensionality...\n\tndims = [ N ];\n\tfor ( i = 1; i < M; i++ ) {\n\t\tndims.push( shapes[ i ].length );\n\t\tif ( ndims[ i ] > N ) {\n\t\t\tN = ndims[ i ];\n\t\t}\n\t}\n\t// Initialize the output array...\n\tfor ( i = 0; i < N; i++ ) {\n\t\tout.push( 0 );\n\t}\n\t// Compute the broadcast shape...\n\ti = N - 1;\n\twhile ( i >= 0 ) {\n\t\tn1 = ndims[ 0 ] - N + i;\n\t\tif ( n1 >= 0 ) {\n\t\t\tdim = sh[ n1 ];\n\t\t} else {\n\t\t\tdim = 1;\n\t\t}\n\t\tfor ( j = 1; j < M; j++ ) {\n\t\t\tn2 = ndims[ j ] - N + i;\n\t\t\tif ( n2 >= 0 ) {\n\t\t\t\td = shapes[ j ][ n2 ];\n\t\t\t} else {\n\t\t\t\td = 1;\n\t\t\t}\n\t\t\tif ( dim === 1 ) {\n\t\t\t\tdim = d;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( d === 1 || dim === d ) {\n\t\t\t\t// When either `d` is `1` or `d` equals the current output shape dimension, the current output shape dimension remains the same...\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// The current shape cannot be broadcast against one of the other shapes...\n\t\t\treturn null;\n\t\t}\n\t\tout[ i ] = dim;\n\t\ti -= 1;\n\t}\n\treturn out;\n}\n\n\n// EXPORTS //\n\nexport default broadcastShapes;\n"],"names":["shapes","ndims","out","dim","sh","n1","n2","d","M","N","i","j","length","push"],"mappings":";gDAkLA,SAA0BA,GACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIJ,GADAT,EAAM,GACK,KAFXM,EAAIR,EAAOY,QAGV,OAAOV,EAMR,GAHAO,GADAL,EAAKJ,EAAQ,IACNY,OAGI,IAANJ,EAAU,CAEd,IAAME,EAAI,EAAGA,EAAID,EAAGC,IACnBR,EAAIW,KAAMT,EAAIM,IAEf,OAAOR,CACP,CAGD,IADAD,EAAQ,CAAEQ,GACJC,EAAI,EAAGA,EAAIF,EAAGE,IACnBT,EAAMY,KAAMb,EAAQU,GAAIE,QACnBX,EAAOS,GAAMD,IACjBA,EAAIR,EAAOS,IAIb,IAAMA,EAAI,EAAGA,EAAID,EAAGC,IACnBR,EAAIW,KAAM,GAIX,IADAH,EAAID,EAAI,EACAC,GAAK,GAAI,CAOhB,IAJCP,GAFDE,EAAKJ,EAAO,GAAMQ,EAAIC,IACX,EACJN,EAAIC,GAEJ,EAEDM,EAAI,EAAGA,EAAIH,EAAGG,IAOnB,GAJCJ,GAFDD,EAAKL,EAAOU,GAAMF,EAAIC,IACX,EACNV,EAAQW,GAAKL,GAEb,EAEQ,IAARH,GAIL,GAAW,IAANI,GAAWJ,IAAQI,EAKxB,OAAO,UARNJ,EAAMI,EAURL,EAAKQ,GAAMP,EACXO,GAAK,CACL,CACD,OAAOR,CACR"}
\ No newline at end of file
diff --git a/dist/index.d.ts b/dist/index.d.ts
deleted file mode 100644
index 87ea8b6..0000000
--- a/dist/index.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-///
-import broadcastShapes from '../docs/types/index';
-export = broadcastShapes;
\ No newline at end of file
diff --git a/dist/index.js b/dist/index.js
deleted file mode 100644
index 625741a..0000000
--- a/dist/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";var d=function(t,e){return function(){return e||t((e={exports:{}}).exports,e),e.exports}};var h=d(function(x,c){
-function g(t){var e,n,u,o,s,l,a,f,i,r,v;if(f=t.length,n=[],f===0)return n;if(o=t[0],i=o.length,f===1){for(r=0;ri&&(i=e[r]);for(r=0;r=0;){for(s=e[0]-i+r,s>=0?u=o[s]:u=1,v=1;v=0?a=t[v][l]:a=1,u===1){u=a;continue}if(!(a===1||u===a))return null}n[r]=u,r-=1}return n}c.exports=g
-});var m=h();module.exports=m;
-/** @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 db2949f..0000000
--- a/dist/index.js.map
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "version": 3,
- "sources": ["../lib/main.js", "../lib/index.js"],
- "sourcesContent": ["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2021 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* Broadcasts array shapes to a single shape.\n*\n* ## Notes\n*\n* - Two respective dimensions in two shape arrays are compatible if\n*\n* 1. the dimensions are equal.\n* 2. one dimension is `1`.\n*\n* - The function returns `null` if provided incompatible shapes (i.e., shapes which cannot be broadcast with one another).\n*\n* @param {Array} shapes - array of shape arrays\n* @returns {(NonNegativeIntegerArray|null)} broadcast shape (or `null`)\n*\n* @example\n* var shapes = [\n* [ 8, 1, 6, 1 ],\n* [ 7, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 7, 6, 5 ]\n*\n* @example\n* var shapes = [\n* [ 5, 4 ],\n* [ 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 5, 4 ]\n*\n* @example\n* var shapes = [\n* [ 5, 4 ],\n* [ 4 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 5, 4 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 15, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 3, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 3, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 1, 7, 1, 5 ],\n* [ 8, 4, 1, 6, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 4, 7, 6, 5 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 0 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 1, 1, 6, 0 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 8, 0, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 0, 1, 6, 1 ]\n*\n* @example\n* var shapes = [\n* [ 8, 8, 1, 6, 1 ],\n* [ 8, 0, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns null\n*\n* @example\n* var shapes = [\n* [ 8, 0, 1, 6, 1 ],\n* [ 8, 8, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns null\n*\n* @example\n* var shapes = [\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [\n* [],\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [\n* [ 3, 2, 1 ],\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 3, 2, 1 ]\n*\n* @example\n* var shapes = [\n* [],\n* [ 3, 2, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 3, 2, 1 ]\n*/\nfunction broadcastShapes( shapes ) {\n\tvar ndims;\n\tvar out;\n\tvar dim;\n\tvar sh;\n\tvar n1;\n\tvar n2;\n\tvar d;\n\tvar M;\n\tvar N;\n\tvar i;\n\tvar j;\n\n\tM = shapes.length;\n\tout = [];\n\tif ( M === 0 ) {\n\t\treturn out;\n\t}\n\tsh = shapes[ 0 ];\n\tN = sh.length;\n\n\t// If provided a single input shape array, then the broadcast shape is input shape...\n\tif ( M === 1 ) {\n\t\t// Need to manually copy to output shape, as shapes could be array-like objects...\n\t\tfor ( i = 0; i < N; i++ ) {\n\t\t\tout.push( sh[ i ] );\n\t\t}\n\t\treturn out;\n\t}\n\t// Determine the maximum dimensionality...\n\tndims = [ N ];\n\tfor ( i = 1; i < M; i++ ) {\n\t\tndims.push( shapes[ i ].length );\n\t\tif ( ndims[ i ] > N ) {\n\t\t\tN = ndims[ i ];\n\t\t}\n\t}\n\t// Initialize the output array...\n\tfor ( i = 0; i < N; i++ ) {\n\t\tout.push( 0 );\n\t}\n\t// Compute the broadcast shape...\n\ti = N - 1;\n\twhile ( i >= 0 ) {\n\t\tn1 = ndims[ 0 ] - N + i;\n\t\tif ( n1 >= 0 ) {\n\t\t\tdim = sh[ n1 ];\n\t\t} else {\n\t\t\tdim = 1;\n\t\t}\n\t\tfor ( j = 1; j < M; j++ ) {\n\t\t\tn2 = ndims[ j ] - N + i;\n\t\t\tif ( n2 >= 0 ) {\n\t\t\t\td = shapes[ j ][ n2 ];\n\t\t\t} else {\n\t\t\t\td = 1;\n\t\t\t}\n\t\t\tif ( dim === 1 ) {\n\t\t\t\tdim = d;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( d === 1 || dim === d ) {\n\t\t\t\t// When either `d` is `1` or `d` equals the current output shape dimension, the current output shape dimension remains the same...\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// The current shape cannot be broadcast against one of the other shapes...\n\t\t\treturn null;\n\t\t}\n\t\tout[ i ] = dim;\n\t\ti -= 1;\n\t}\n\treturn out;\n}\n\n\n// EXPORTS //\n\nmodule.exports = broadcastShapes;\n", "/**\n* @license Apache-2.0\n*\n* Copyright (c) 2021 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* Broadcast array shapes to a single shape.\n*\n* @module @stdlib/ndarray-base-broadcast-shapes\n*\n* @example\n* var broadcastShapes = require( '@stdlib/ndarray-base-broadcast-shapes' );\n*\n* var shapes = [\n* [ 8, 1, 6, 1 ],\n* [ 7, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 7, 6, 5 ]\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,cAkLA,SAASC,EAAiBC,EAAS,CAClC,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIJ,GAFAH,EAAIR,EAAO,OACXE,EAAM,CAAC,EACFM,IAAM,EACV,OAAON,EAMR,GAJAE,EAAKJ,EAAQ,CAAE,EACfS,EAAIL,EAAG,OAGFI,IAAM,EAAI,CAEd,IAAME,EAAI,EAAGA,EAAID,EAAGC,IACnBR,EAAI,KAAME,EAAIM,CAAE,CAAE,EAEnB,OAAOR,CACR,CAGA,IADAD,EAAQ,CAAEQ,CAAE,EACNC,EAAI,EAAGA,EAAIF,EAAGE,IACnBT,EAAM,KAAMD,EAAQU,CAAE,EAAE,MAAO,EAC1BT,EAAOS,CAAE,EAAID,IACjBA,EAAIR,EAAOS,CAAE,GAIf,IAAMA,EAAI,EAAGA,EAAID,EAAGC,IACnBR,EAAI,KAAM,CAAE,EAIb,IADAQ,EAAID,EAAI,EACAC,GAAK,GAAI,CAOhB,IANAL,EAAKJ,EAAO,CAAE,EAAIQ,EAAIC,EACjBL,GAAM,EACVF,EAAMC,EAAIC,CAAG,EAEbF,EAAM,EAEDQ,EAAI,EAAGA,EAAIH,EAAGG,IAAM,CAOzB,GANAL,EAAKL,EAAOU,CAAE,EAAIF,EAAIC,EACjBJ,GAAM,EACVC,EAAIP,EAAQW,CAAE,EAAGL,CAAG,EAEpBC,EAAI,EAEAJ,IAAQ,EAAI,CAChBA,EAAMI,EACN,QACD,CACA,GAAK,EAAAA,IAAM,GAAKJ,IAAQI,GAKxB,OAAO,IACR,CACAL,EAAKQ,CAAE,EAAIP,EACXO,GAAK,CACN,CACA,OAAOR,CACR,CAKAJ,EAAO,QAAUC,ICxNjB,IAAIa,EAAO,IAKX,OAAO,QAAUA",
- "names": ["require_main", "__commonJSMin", "exports", "module", "broadcastShapes", "shapes", "ndims", "out", "dim", "sh", "n1", "n2", "d", "M", "N", "i", "j", "main"]
-}
diff --git a/docs/repl.txt b/docs/repl.txt
deleted file mode 100644
index f1d92f6..0000000
--- a/docs/repl.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-
-{{alias}}( shapes )
- Broadcasts array shapes to a single shape.
-
- Two respective dimensions in two shape arrays are compatible if
-
- 1. the dimensions are equal.
- 2. one dimension is `1`.
-
- The function returns `null` if provided incompatible shapes (i.e., shapes
- which cannot be broadcast with one another).
-
- Parameters
- ----------
- shapes: Array
- Array of shape arrays.
-
- Returns
- -------
- out: Array|null
- Broadcast shape.
-
- Examples
- --------
- // Compatible shapes:
- > var sh1 = [ 8, 1, 6, 1 ];
- > var sh2 = [ 7, 1, 5 ];
- > var sh = {{alias}}( [ sh1, sh2 ] )
- [ 8, 7, 6, 5 ]
-
- // Incompatible shapes:
- > sh1 = [ 3, 2 ];
- > sh1 = [ 2, 3 ];
- > sh = {{alias}}( [ sh1, sh2 ] )
- null
-
- See Also
- --------
-
diff --git a/docs/types/index.d.ts b/docs/types/index.d.ts
deleted file mode 100644
index c2702cf..0000000
--- a/docs/types/index.d.ts
+++ /dev/null
@@ -1,177 +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.
-*/
-
-// TypeScript Version: 4.1
-
-///
-
-import { ArrayLike } from '@stdlib/types/array';
-
-/**
-* Broadcasts array shapes to a single shape.
-*
-* ## Notes
-*
-* - Two respective dimensions in two shape arrays are compatible if
-*
-* 1. the dimensions are equal.
-* 2. one dimension is `1`.
-*
-* - The function returns `null` if provided incompatible shapes (i.e., shapes which cannot be broadcast with one another).
-*
-* @param shapes - array shapes
-* @returns broadcast shape
-*
-* @example
-* var shapes = [
-* [ 8, 1, 6, 1 ],
-* [ 7, 1, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 7, 6, 5 ]
-*
-* @example
-* var shapes = [
-* [ 5, 4 ],
-* [ 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 5, 4 ]
-*
-* @example
-* var shapes = [
-* [ 5, 4 ],
-* [ 4 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 5, 4 ]
-*
-* @example
-* var shapes = [
-* [ 15, 3, 5 ],
-* [ 15, 1, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 15, 3, 5 ]
-*
-* @example
-* var shapes = [
-* [ 15, 3, 5 ],
-* [ 3, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 15, 3, 5 ]
-*
-* @example
-* var shapes = [
-* [ 15, 3, 5 ],
-* [ 3, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 15, 3, 5 ]
-*
-* @example
-* var shapes = [
-* [ 8, 1, 1, 6, 1 ],
-* [ 1, 7, 1, 5 ],
-* [ 8, 4, 1, 6, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 4, 7, 6, 5 ]
-*
-* @example
-* var shapes = [
-* [ 8, 1, 1, 6, 1 ],
-* [ 0 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 1, 1, 6, 0 ]
-*
-* @example
-* var shapes = [
-* [ 8, 1, 1, 6, 1 ],
-* [ 8, 0, 1, 6, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 0, 1, 6, 1 ]
-*
-* @example
-* var shapes = [
-* [ 8, 8, 1, 6, 1 ],
-* [ 8, 0, 1, 6, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns null
-*
-* @example
-* var shapes = [
-* []
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns []
-*
-* @example
-* var shapes = [
-* [],
-* []
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns []
-*
-* @example
-* var shapes = [];
-*
-* var out = broadcastShapes( shapes );
-* // returns []
-*
-* @example
-* var shapes = [
-* [ 3, 2, 1 ],
-* []
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 3, 2, 1 ]
-*
-* @example
-* var shapes = [
-* [],
-* [ 3, 2, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 3, 2, 1 ]
-*/
-declare function broadcastShapes( shapes: ArrayLike> ): ArrayLike;
-
-
-// EXPORTS //
-
-export = broadcastShapes;
diff --git a/docs/types/test.ts b/docs/types/test.ts
deleted file mode 100644
index 2886539..0000000
--- a/docs/types/test.ts
+++ /dev/null
@@ -1,45 +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.
-*/
-
-import broadcastShapes = require( './index' );
-
-
-// TESTS //
-
-// The function returns an array of numbers...
-{
- broadcastShapes( [ [ 1, 2 ], [ 2, 2 ] ] ); // $ExpectType ArrayLike
-}
-
-// The compiler throws an error if the function is not provided an array-like object containing array-like objects containing numbers...
-{
- broadcastShapes( '5' ); // $ExpectError
- broadcastShapes( 5 ); // $ExpectError
- broadcastShapes( true ); // $ExpectError
- broadcastShapes( false ); // $ExpectError
- broadcastShapes( null ); // $ExpectError
- broadcastShapes( {} ); // $ExpectError
- broadcastShapes( [ '5' ] ); // $ExpectError
- broadcastShapes( ( x: number ): number => x ); // $ExpectError
-}
-
-// The compiler throws an error if the function is provided an unsupported number of arguments...
-{
- broadcastShapes(); // $ExpectError
- broadcastShapes( [ [ 1, 2, 3 ] ], [ 2, 3 ] ); // $ExpectError
-}
diff --git a/examples/c/Makefile b/examples/c/Makefile
deleted file mode 100644
index 70c91f4..0000000
--- a/examples/c/Makefile
+++ /dev/null
@@ -1,146 +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.
-#/
-
-# VARIABLES #
-
-ifndef VERBOSE
- QUIET := @
-else
- QUIET :=
-endif
-
-# Determine the OS ([1][1], [2][2]).
-#
-# [1]: https://en.wikipedia.org/wiki/Uname#Examples
-# [2]: http://stackoverflow.com/a/27776822/2225624
-OS ?= $(shell uname)
-ifneq (, $(findstring MINGW,$(OS)))
- OS := WINNT
-else
-ifneq (, $(findstring MSYS,$(OS)))
- OS := WINNT
-else
-ifneq (, $(findstring CYGWIN,$(OS)))
- OS := WINNT
-else
-ifneq (, $(findstring Windows_NT,$(OS)))
- OS := WINNT
-endif
-endif
-endif
-endif
-
-# Define the program used for compiling C source files:
-ifdef C_COMPILER
- CC := $(C_COMPILER)
-else
- CC := gcc
-endif
-
-# Define the command-line options when compiling C files:
-CFLAGS ?= \
- -std=c99 \
- -O3 \
- -Wall \
- -pedantic
-
-# Determine whether to generate position independent code ([1][1], [2][2]).
-#
-# [1]: https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen-Options
-# [2]: http://stackoverflow.com/questions/5311515/gcc-fpic-option
-ifeq ($(OS), WINNT)
- fPIC ?=
-else
- fPIC ?= -fPIC
-endif
-
-# List of includes (e.g., `-I /foo/bar -I /beep/boop/include`):
-INCLUDE ?=
-
-# List of source files:
-SOURCE_FILES ?=
-
-# List of libraries (e.g., `-lopenblas -lpthread`):
-LIBRARIES ?=
-
-# List of library paths (e.g., `-L /foo/bar -L /beep/boop`):
-LIBPATH ?=
-
-# List of C targets:
-c_targets := example.out
-
-
-# RULES #
-
-#/
-# Compiles source files.
-#
-# @param {string} [C_COMPILER] - C compiler (e.g., `gcc`)
-# @param {string} [CFLAGS] - C compiler options
-# @param {(string|void)} [fPIC] - compiler flag determining whether to generate position independent code (e.g., `-fPIC`)
-# @param {string} [INCLUDE] - list of includes (e.g., `-I /foo/bar -I /beep/boop/include`)
-# @param {string} [SOURCE_FILES] - list of source files
-# @param {string} [LIBPATH] - list of library paths (e.g., `-L /foo/bar -L /beep/boop`)
-# @param {string} [LIBRARIES] - list of libraries (e.g., `-lopenblas -lpthread`)
-#
-# @example
-# make
-#
-# @example
-# make all
-#/
-all: $(c_targets)
-
-.PHONY: all
-
-#/
-# Compiles C source files.
-#
-# @private
-# @param {string} CC - C compiler (e.g., `gcc`)
-# @param {string} CFLAGS - C compiler options
-# @param {(string|void)} fPIC - compiler flag determining whether to generate position independent code (e.g., `-fPIC`)
-# @param {string} INCLUDE - list of includes (e.g., `-I /foo/bar`)
-# @param {string} SOURCE_FILES - list of source files
-# @param {string} LIBPATH - list of library paths (e.g., `-L /foo/bar`)
-# @param {string} LIBRARIES - list of libraries (e.g., `-lopenblas`)
-#/
-$(c_targets): %.out: %.c
- $(QUIET) $(CC) $(CFLAGS) $(fPIC) $(INCLUDE) -o $@ $(SOURCE_FILES) $< $(LIBPATH) -lm $(LIBRARIES)
-
-#/
-# Runs compiled examples.
-#
-# @example
-# make run
-#/
-run: $(c_targets)
- $(QUIET) ./$<
-
-.PHONY: run
-
-#/
-# Removes generated files.
-#
-# @example
-# make clean
-#/
-clean:
- $(QUIET) -rm -f *.o *.out
-
-.PHONY: clean
diff --git a/examples/c/example.c b/examples/c/example.c
deleted file mode 100644
index 4bc54d5..0000000
--- a/examples/c/example.c
+++ /dev/null
@@ -1,50 +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.
-*/
-
-#include "stdlib/ndarray/base/broadcast_shapes.h"
-#include
-#include
-#include
-
-int main( void ) {
- int64_t N1 = 4;
- int64_t sh1[] = { 8, 1, 6, 1 };
-
- int64_t N2 = 3;
- int64_t sh2[] = { 7, 1, 5 };
-
- int64_t ndims[] = { N1, N2 };
- int64_t *shapes[] = { sh1, sh2 };
-
- int64_t out[] = { 0, 0, 0, 0 };
- int8_t status = stdlib_ndarray_broadcast_shapes( 2, shapes, ndims, out );
- if ( status != 0 ) {
- printf( "incompatible shapes\n" );
- return 1;
- }
- int64_t i;
- printf( "shape = ( " );
- for ( i = 0; i < N1; i++ ) {
- printf( "%"PRId64"", out[ i ] );
- if ( i < N1-1 ) {
- printf( ", " );
- }
- }
- printf( " )\n" );
- return 0;
-}
diff --git a/examples/index.js b/examples/index.js
deleted file mode 100644
index 28811f9..0000000
--- a/examples/index.js
+++ /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.
-*/
-
-'use strict';
-
-var lpad = require( '@stdlib/string-left-pad' );
-var broadcastShapes = require( './../lib' );
-
-var shapes;
-var out;
-var sh;
-var i;
-var j;
-
-function shape2string( shape ) {
- return lpad( shape.join( ' x ' ), 20, ' ' );
-}
-
-shapes = [
- [ [ 1, 2 ], [ 2 ] ],
- [ [ 1, 1 ], [ 3, 4 ] ],
- [ [ 6, 7 ], [ 5, 6, 1 ], [ 7 ], [ 5, 1, 7 ] ],
- [ [ 1, 3 ], [ 3, 1 ] ],
- [ [ 1 ], [ 3 ] ],
- [ [ 2 ], [ 3, 2 ] ],
- [ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ] ],
- [ [ 1, 2 ], [ 1, 2 ] ]
-];
-
-for ( i = 0; i < shapes.length; i++ ) {
- sh = shapes[ i ];
- for ( j = 0; j < sh.length; j++ ) {
- console.log( shape2string( sh[ j ] ) );
- }
- console.log( lpad( '', 20, '-' ) );
-
- out = broadcastShapes( sh );
- console.log( shape2string( out )+'\n' );
-}
diff --git a/include/stdlib/ndarray/base/broadcast_shapes.h b/include/stdlib/ndarray/base/broadcast_shapes.h
deleted file mode 100644
index 33581cb..0000000
--- a/include/stdlib/ndarray/base/broadcast_shapes.h
+++ /dev/null
@@ -1,40 +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.
-*/
-
-#ifndef STDLIB_NDARRAY_BASE_BROADCAST_SHAPES_H
-#define STDLIB_NDARRAY_BASE_BROADCAST_SHAPES_H
-
-#include
-
-/*
-* If C++, prevent name mangling so that the compiler emits a binary file having undecorated names, thus mirroring the behavior of a C compiler.
-*/
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
-* Broadcasts array shapes to a single shape.
-*/
-int8_t stdlib_ndarray_broadcast_shapes( const int64_t M, const int64_t *shapes[], const int64_t ndims[], int64_t *out );
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // !STDLIB_NDARRAY_BASE_BROADCAST_SHAPES_H
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..0e33446
--- /dev/null
+++ b/index.js
@@ -0,0 +1,3 @@
+// Copyright (c) 2025 The Stdlib Authors. License is Apache-2.0: http://www.apache.org/licenses/LICENSE-2.0
+var e,f;e=this,f=function(){"use strict";return function(e){var f,n,t,r,o,u,i,s,l,d,h;if(n=[],0===(s=e.length))return n;if(l=(r=e[0]).length,1===s){for(d=0;dl&&(l=f[d]);for(d=0;d=0;){for(t=(o=f[0]-l+d)>=0?r[o]:1,h=1;h=0?e[h][u]:1,1!==t){if(1!==i&&t!==i)return null}else t=i;n[d]=t,d-=1}return n}},"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define(f):(e="undefined"!=typeof globalThis?globalThis:e||self).broadcastShapes=f();
+//# sourceMappingURL=index.js.map
diff --git a/index.js.map b/index.js.map
new file mode 100644
index 0000000..0c02c0f
--- /dev/null
+++ b/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sources":["../lib/main.js"],"sourcesContent":["/**\n* @license Apache-2.0\n*\n* Copyright (c) 2021 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* Broadcasts array shapes to a single shape.\n*\n* ## Notes\n*\n* - Two respective dimensions in two shape arrays are compatible if\n*\n* 1. the dimensions are equal.\n* 2. one dimension is `1`.\n*\n* - The function returns `null` if provided incompatible shapes (i.e., shapes which cannot be broadcast with one another).\n*\n* @param {Array} shapes - array of shape arrays\n* @returns {(NonNegativeIntegerArray|null)} broadcast shape (or `null`)\n*\n* @example\n* var shapes = [\n* [ 8, 1, 6, 1 ],\n* [ 7, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 7, 6, 5 ]\n*\n* @example\n* var shapes = [\n* [ 5, 4 ],\n* [ 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 5, 4 ]\n*\n* @example\n* var shapes = [\n* [ 5, 4 ],\n* [ 4 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 5, 4 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 15, 1, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 3, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 15, 3, 5 ],\n* [ 3, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 15, 3, 5 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 1, 7, 1, 5 ],\n* [ 8, 4, 1, 6, 5 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 4, 7, 6, 5 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 0 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 1, 1, 6, 0 ]\n*\n* @example\n* var shapes = [\n* [ 8, 1, 1, 6, 1 ],\n* [ 8, 0, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 8, 0, 1, 6, 1 ]\n*\n* @example\n* var shapes = [\n* [ 8, 8, 1, 6, 1 ],\n* [ 8, 0, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns null\n*\n* @example\n* var shapes = [\n* [ 8, 0, 1, 6, 1 ],\n* [ 8, 8, 1, 6, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns null\n*\n* @example\n* var shapes = [\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [\n* [],\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [];\n*\n* var out = broadcastShapes( shapes );\n* // returns []\n*\n* @example\n* var shapes = [\n* [ 3, 2, 1 ],\n* []\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 3, 2, 1 ]\n*\n* @example\n* var shapes = [\n* [],\n* [ 3, 2, 1 ]\n* ];\n*\n* var out = broadcastShapes( shapes );\n* // returns [ 3, 2, 1 ]\n*/\nfunction broadcastShapes( shapes ) {\n\tvar ndims;\n\tvar out;\n\tvar dim;\n\tvar sh;\n\tvar n1;\n\tvar n2;\n\tvar d;\n\tvar M;\n\tvar N;\n\tvar i;\n\tvar j;\n\n\tM = shapes.length;\n\tout = [];\n\tif ( M === 0 ) {\n\t\treturn out;\n\t}\n\tsh = shapes[ 0 ];\n\tN = sh.length;\n\n\t// If provided a single input shape array, then the broadcast shape is input shape...\n\tif ( M === 1 ) {\n\t\t// Need to manually copy to output shape, as shapes could be array-like objects...\n\t\tfor ( i = 0; i < N; i++ ) {\n\t\t\tout.push( sh[ i ] );\n\t\t}\n\t\treturn out;\n\t}\n\t// Determine the maximum dimensionality...\n\tndims = [ N ];\n\tfor ( i = 1; i < M; i++ ) {\n\t\tndims.push( shapes[ i ].length );\n\t\tif ( ndims[ i ] > N ) {\n\t\t\tN = ndims[ i ];\n\t\t}\n\t}\n\t// Initialize the output array...\n\tfor ( i = 0; i < N; i++ ) {\n\t\tout.push( 0 );\n\t}\n\t// Compute the broadcast shape...\n\ti = N - 1;\n\twhile ( i >= 0 ) {\n\t\tn1 = ndims[ 0 ] - N + i;\n\t\tif ( n1 >= 0 ) {\n\t\t\tdim = sh[ n1 ];\n\t\t} else {\n\t\t\tdim = 1;\n\t\t}\n\t\tfor ( j = 1; j < M; j++ ) {\n\t\t\tn2 = ndims[ j ] - N + i;\n\t\t\tif ( n2 >= 0 ) {\n\t\t\t\td = shapes[ j ][ n2 ];\n\t\t\t} else {\n\t\t\t\td = 1;\n\t\t\t}\n\t\t\tif ( dim === 1 ) {\n\t\t\t\tdim = d;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( d === 1 || dim === d ) {\n\t\t\t\t// When either `d` is `1` or `d` equals the current output shape dimension, the current output shape dimension remains the same...\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// The current shape cannot be broadcast against one of the other shapes...\n\t\t\treturn null;\n\t\t}\n\t\tout[ i ] = dim;\n\t\ti -= 1;\n\t}\n\treturn out;\n}\n\n\n// EXPORTS //\n\nexport default broadcastShapes;\n"],"names":["shapes","ndims","out","dim","sh","n1","n2","d","M","N","i","j","length","push"],"mappings":";gDAkLA,SAA0BA,GACzB,IAAIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAIJ,GADAT,EAAM,GACK,KAFXM,EAAIR,EAAOY,QAGV,OAAOV,EAMR,GAHAO,GADAL,EAAKJ,EAAQ,IACNY,OAGI,IAANJ,EAAU,CAEd,IAAME,EAAI,EAAGA,EAAID,EAAGC,IACnBR,EAAIW,KAAMT,EAAIM,IAEf,OAAOR,CACP,CAGD,IADAD,EAAQ,CAAEQ,GACJC,EAAI,EAAGA,EAAIF,EAAGE,IACnBT,EAAMY,KAAMb,EAAQU,GAAIE,QACnBX,EAAOS,GAAMD,IACjBA,EAAIR,EAAOS,IAIb,IAAMA,EAAI,EAAGA,EAAID,EAAGC,IACnBR,EAAIW,KAAM,GAIX,IADAH,EAAID,EAAI,EACAC,GAAK,GAAI,CAOhB,IAJCP,GAFDE,EAAKJ,EAAO,GAAMQ,EAAIC,IACX,EACJN,EAAIC,GAEJ,EAEDM,EAAI,EAAGA,EAAIH,EAAGG,IAOnB,GAJCJ,GAFDD,EAAKL,EAAOU,GAAMF,EAAIC,IACX,EACNV,EAAQW,GAAKL,GAEb,EAEQ,IAARH,GAIL,GAAW,IAANI,GAAWJ,IAAQI,EAKxB,OAAO,UARNJ,EAAMI,EAURL,EAAKQ,GAAMP,EACXO,GAAK,CACL,CACD,OAAOR,CACR"}
\ No newline at end of file
diff --git a/lib/index.js b/lib/index.js
deleted file mode 100644
index 0c9817e..0000000
--- a/lib/index.js
+++ /dev/null
@@ -1,45 +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.
-*/
-
-'use strict';
-
-/**
-* Broadcast array shapes to a single shape.
-*
-* @module @stdlib/ndarray-base-broadcast-shapes
-*
-* @example
-* var broadcastShapes = require( '@stdlib/ndarray-base-broadcast-shapes' );
-*
-* var shapes = [
-* [ 8, 1, 6, 1 ],
-* [ 7, 1, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 7, 6, 5 ]
-*/
-
-// 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 8558e60..0000000
--- a/lib/main.js
+++ /dev/null
@@ -1,256 +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.
-*/
-
-'use strict';
-
-// MAIN //
-
-/**
-* Broadcasts array shapes to a single shape.
-*
-* ## Notes
-*
-* - Two respective dimensions in two shape arrays are compatible if
-*
-* 1. the dimensions are equal.
-* 2. one dimension is `1`.
-*
-* - The function returns `null` if provided incompatible shapes (i.e., shapes which cannot be broadcast with one another).
-*
-* @param {Array} shapes - array of shape arrays
-* @returns {(NonNegativeIntegerArray|null)} broadcast shape (or `null`)
-*
-* @example
-* var shapes = [
-* [ 8, 1, 6, 1 ],
-* [ 7, 1, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 7, 6, 5 ]
-*
-* @example
-* var shapes = [
-* [ 5, 4 ],
-* [ 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 5, 4 ]
-*
-* @example
-* var shapes = [
-* [ 5, 4 ],
-* [ 4 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 5, 4 ]
-*
-* @example
-* var shapes = [
-* [ 15, 3, 5 ],
-* [ 15, 1, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 15, 3, 5 ]
-*
-* @example
-* var shapes = [
-* [ 15, 3, 5 ],
-* [ 3, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 15, 3, 5 ]
-*
-* @example
-* var shapes = [
-* [ 15, 3, 5 ],
-* [ 3, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 15, 3, 5 ]
-*
-* @example
-* var shapes = [
-* [ 8, 1, 1, 6, 1 ],
-* [ 1, 7, 1, 5 ],
-* [ 8, 4, 1, 6, 5 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 4, 7, 6, 5 ]
-*
-* @example
-* var shapes = [
-* [ 8, 1, 1, 6, 1 ],
-* [ 0 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 1, 1, 6, 0 ]
-*
-* @example
-* var shapes = [
-* [ 8, 1, 1, 6, 1 ],
-* [ 8, 0, 1, 6, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 8, 0, 1, 6, 1 ]
-*
-* @example
-* var shapes = [
-* [ 8, 8, 1, 6, 1 ],
-* [ 8, 0, 1, 6, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns null
-*
-* @example
-* var shapes = [
-* [ 8, 0, 1, 6, 1 ],
-* [ 8, 8, 1, 6, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns null
-*
-* @example
-* var shapes = [
-* []
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns []
-*
-* @example
-* var shapes = [
-* [],
-* []
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns []
-*
-* @example
-* var shapes = [];
-*
-* var out = broadcastShapes( shapes );
-* // returns []
-*
-* @example
-* var shapes = [
-* [ 3, 2, 1 ],
-* []
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 3, 2, 1 ]
-*
-* @example
-* var shapes = [
-* [],
-* [ 3, 2, 1 ]
-* ];
-*
-* var out = broadcastShapes( shapes );
-* // returns [ 3, 2, 1 ]
-*/
-function broadcastShapes( shapes ) {
- var ndims;
- var out;
- var dim;
- var sh;
- var n1;
- var n2;
- var d;
- var M;
- var N;
- var i;
- var j;
-
- M = shapes.length;
- out = [];
- if ( M === 0 ) {
- return out;
- }
- sh = shapes[ 0 ];
- N = sh.length;
-
- // If provided a single input shape array, then the broadcast shape is input shape...
- if ( M === 1 ) {
- // Need to manually copy to output shape, as shapes could be array-like objects...
- for ( i = 0; i < N; i++ ) {
- out.push( sh[ i ] );
- }
- return out;
- }
- // Determine the maximum dimensionality...
- ndims = [ N ];
- for ( i = 1; i < M; i++ ) {
- ndims.push( shapes[ i ].length );
- if ( ndims[ i ] > N ) {
- N = ndims[ i ];
- }
- }
- // Initialize the output array...
- for ( i = 0; i < N; i++ ) {
- out.push( 0 );
- }
- // Compute the broadcast shape...
- i = N - 1;
- while ( i >= 0 ) {
- n1 = ndims[ 0 ] - N + i;
- if ( n1 >= 0 ) {
- dim = sh[ n1 ];
- } else {
- dim = 1;
- }
- for ( j = 1; j < M; j++ ) {
- n2 = ndims[ j ] - N + i;
- if ( n2 >= 0 ) {
- d = shapes[ j ][ n2 ];
- } else {
- d = 1;
- }
- if ( dim === 1 ) {
- dim = d;
- continue;
- }
- if ( d === 1 || dim === d ) {
- // When either `d` is `1` or `d` equals the current output shape dimension, the current output shape dimension remains the same...
- continue;
- }
- // The current shape cannot be broadcast against one of the other shapes...
- return null;
- }
- out[ i ] = dim;
- i -= 1;
- }
- return out;
-}
-
-
-// EXPORTS //
-
-module.exports = broadcastShapes;
diff --git a/manifest.json b/manifest.json
deleted file mode 100644
index 04e61e3..0000000
--- a/manifest.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "options": {},
- "fields": [
- {
- "field": "src",
- "resolve": true,
- "relative": true
- },
- {
- "field": "include",
- "resolve": true,
- "relative": true
- },
- {
- "field": "libraries",
- "resolve": false,
- "relative": false
- },
- {
- "field": "libpath",
- "resolve": true,
- "relative": false
- }
- ],
- "confs": [
- {
- "src": [
- "./src/main.c"
- ],
- "include": [
- "./include"
- ],
- "libraries": [],
- "libpath": [],
- "dependencies": []
- }
- ]
-}
diff --git a/package.json b/package.json
index 6259d77..a9ff889 100644
--- a/package.json
+++ b/package.json
@@ -3,33 +3,7 @@
"version": "0.2.2",
"description": "Broadcast array shapes to a single shape.",
"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",
- "include": "./include",
- "lib": "./lib",
- "src": "./src",
- "test": "./test"
- },
- "types": "./docs/types",
- "scripts": {
- "test": "make test",
- "test-cov": "make test-cov",
- "examples": "make examples",
- "benchmark": "make benchmark"
- },
+ "main": "./index.js",
"homepage": "https://stdlib.io",
"repository": {
"type": "git",
@@ -38,32 +12,6 @@
"bugs": {
"url": "https://github.com/stdlib-js/stdlib/issues"
},
- "dependencies": {
- "@stdlib/types": "^0.4.3",
- "@stdlib/utils-library-manifest": "^0.2.2"
- },
- "devDependencies": {
- "@stdlib/string-left-pad": "^0.2.2",
- "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",
@@ -79,7 +27,6 @@
"utils",
"util"
],
- "__stdlib__": {},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/stdlib"
diff --git a/src/main.c b/src/main.c
deleted file mode 100644
index 547d921..0000000
--- a/src/main.c
+++ /dev/null
@@ -1,118 +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.
-*/
-
-#include "stdlib/ndarray/base/broadcast_shapes.h"
-#include
-
-/**
-* Broadcasts array shapes to a single shape.
-*
-* ## Notes
-*
-* - Two respective dimensions in two shape arrays are compatible if
-*
-* 1. the dimensions are equal.
-* 2. one dimension is `1`.
-*
-* - If successful, the function returns `0`; otherwise, the function returns `-1` (e.g., due to incompatible shapes).
-*
-* - Even if the function is unsuccessful, the function may still overwrite elements in the output array before returning. In other words, do not assume that providing incompatible shapes is a no-op with regard to the output array.
-*
-* @param M number of array shapes
-* @param shapes pointer to an array containing shape arrays
-* @param ndims array containing the number of dimensions for (i.e., length of) each respective shape array
-* @param out pointer to output array
-* @return status
-*
-* @example
-* #include "stdlib/ndarray/base/broadcast_shapes.h"
-* #include
-*
-* int64_t N1 = 4;
-* int64_t sh1[] = { 8, 1, 6, 1 };
-*
-* int64_t N2 = 3;
-* int64_t sh2[] = { 7, 1, 5 };
-*
-* int64_t ndims[] = { N1, N2 };
-* int64_t *shapes[] = { sh1, sh2 };
-*
-* int64_t out[] = { 0, 0, 0, 0 };
-* int8_t status = stdlib_ndarray_broadcast_shapes( 2, shapes, ndims, out );
-*/
-int8_t stdlib_ndarray_broadcast_shapes( const int64_t M, const int64_t *shapes[], const int64_t ndims[], int64_t *out ) {
- int64_t dim;
- const int64_t *sh;
- int64_t n1;
- int64_t n2;
- int64_t d;
- int64_t N;
- int64_t i;
- int64_t j;
-
- if ( M == 0 ) {
- return 0;
- }
- sh = shapes[ 0 ];
- N = ndims[ 0 ];
-
- // If provided a single input shape array, then the broadcast shape is input shape...
- if ( M == 1 ) {
- for ( i = 0; i < N; i++ ) {
- out[ i ] = sh[ i ];
- }
- return 0;
- }
- // Determine the maximum dimensionality...
- for ( i = 1; i < M; i++ ) {
- if ( ndims[ i ] > N ) {
- N = ndims[ i ];
- }
- }
- // Compute the broadcast shape...
- i = N - 1;
- while ( i >= 0 ) {
- n1 = ndims[ 0 ] - N + i;
- if ( n1 >= 0 ) {
- dim = sh[ n1 ];
- } else {
- dim = 1;
- }
- for ( j = 1; j < M; j++ ) {
- n2 = ndims[ j ] - N + i;
- if ( n2 >= 0 ) {
- d = shapes[ j ][ n2 ];
- } else {
- d = 1;
- }
- if ( dim == 1 ) {
- dim = d;
- continue;
- }
- if ( d == 1 || dim == d ) {
- // When either `d` is `1` or `d` equals the current output shape dimension, the current output shape dimension remains the same...
- continue;
- }
- // The current shape cannot be broadcast against one of the other shapes...
- return -1;
- }
- out[ i ] = dim;
- i -= 1;
- }
- return 0;
-}
diff --git a/stats_browser.html b/stats_browser.html
new file mode 100644
index 0000000..2f35700
--- /dev/null
+++ b/stats_browser.html
@@ -0,0 +1,4842 @@
+
+
+
+
+
+
+
+ Rollup Visualizer
+
+
+
+
+
+
+
+
+
diff --git a/stats_node.html b/stats_node.html
new file mode 100644
index 0000000..c264c7d
--- /dev/null
+++ b/stats_node.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 63f703c..0000000
--- a/test/test.js
+++ /dev/null
@@ -1,230 +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.
-*/
-
-'use strict';
-
-// MODULES //
-
-var tape = require( 'tape' );
-var broadcastShapes = require( './../lib' );
-
-
-// TESTS //
-
-tape( 'main export is a function', function test( t ) {
- t.ok( true, __filename );
- t.strictEqual( typeof broadcastShapes, 'function', 'main export is a function' );
- t.end();
-});
-
-tape( 'the function broadcasts array shapes to a single shape', function test( t ) {
- var expected;
- var actual;
- var values;
- var i;
-
- values = [
- [ [ 1, 2 ], [ 2 ] ],
- [ [ 1, 1 ], [ 3, 4 ] ],
- [ [ 6, 7 ], [ 5, 6, 1 ], [ 7 ], [ 5, 1, 7 ] ],
- [ [ 1, 3 ], [ 3, 1 ] ],
- [ [ 1 ], [ 3 ] ],
- [ [ 2 ], [ 3, 2 ] ],
- [ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ], [ 2, 3 ] ],
- [ [ 1, 2 ], [ 1, 2 ] ]
- ];
-
- expected = [
- [ 1, 2 ],
- [ 3, 4 ],
- [ 5, 6, 7 ],
- [ 3, 3 ],
- [ 3 ],
- [ 3, 2 ],
- [ 2, 3 ],
- [ 1, 2 ]
- ];
-
- for ( i = 0; i < values.length; i++ ) {
- actual = broadcastShapes( values[ i ] );
- t.deepEqual( actual, expected[ i ], 'returns expected value. Actual: ('+actual.join( ',' )+'). Expected: ('+expected[ i ].join( ',' )+').' );
- }
- t.end();
-});
-
-tape( 'the function broadcasts array shapes to a single shape (empty dims)', function test( t ) {
- var expected;
- var actual;
- var values;
- var i;
-
- values = [
- [ [ 1, 0 ], [ 0, 0 ] ],
- [ [ 0, 1 ], [ 0, 0 ] ],
- [ [ 1, 0 ], [ 0, 1 ] ],
- [ [ 1, 1 ], [ 0, 0 ] ],
- [ [ 1, 1 ], [ 1, 0 ] ],
- [ [ 1, 1 ], [ 0, 1 ] ],
- [ [ 0 ], [ 0, 0 ] ],
- [ [ 0 ], [ 0, 1 ] ],
- [ [ 1 ], [ 0, 0 ] ],
- [ [ 1, 1 ], [ 0 ] ],
- [ [ 1 ], [ 0, 1 ] ],
- [ [ 1 ], [ 1, 0 ] ],
- [ [ 1 ], [ 8, 0 ] ],
- [ [ 8, 1, 6, 1 ], [ 0, 1, 5 ] ],
- [ [ 8, 0, 6, 1 ], [ 1, 5 ] ]
- ];
-
- expected = [
- [ 0, 0 ],
- [ 0, 0 ],
- [ 0, 0 ],
- [ 0, 0 ],
- [ 1, 0 ],
- [ 0, 1 ],
- [ 0, 0 ],
- [ 0, 0 ],
- [ 0, 0 ],
- [ 1, 0 ],
- [ 0, 1 ],
- [ 1, 0 ],
- [ 8, 0 ],
- [ 8, 0, 6, 5 ],
- [ 8, 0, 6, 5 ]
- ];
-
- for ( i = 0; i < values.length; i++ ) {
- actual = broadcastShapes( values[ i ] );
- t.deepEqual( actual, expected[ i ], 'returns expected value. Actual: ('+actual.join( ',' )+'). Expected: ('+expected[ i ].join( ',' )+').' );
- }
- t.end();
-});
-
-tape( 'the function broadcasts array shapes to a single shape (no shapes)', function test( t ) {
- var expected;
- var actual;
- var values;
- var i;
-
- values = [
- []
- ];
-
- expected = [
- []
- ];
-
- for ( i = 0; i < values.length; i++ ) {
- actual = broadcastShapes( values[ i ] );
- t.deepEqual( actual, expected[ i ], 'returns expected value. Actual: ('+actual.join( ',' )+'). Expected: ('+expected[ i ].join( ',' )+').' );
- }
- t.end();
-});
-
-tape( 'the function broadcasts array shapes to a single shape (empty shapes (i.e., zero-dimensional array broadcasting))', function test( t ) {
- var expected;
- var actual;
- var values;
- var i;
-
- values = [
- [ [] ],
- [ [], [] ],
- [ [], [], [] ],
- [ [], [ 0 ] ],
- [ [ 0 ], [] ],
- [ [], [ 0, 0 ] ],
- [ [ 0, 0 ], [] ],
- [ [], [ 1, 0 ] ],
- [ [], [ 0, 1 ] ],
- [ [], [ 3, 3 ] ],
- [ [], [ 3, 3 ], [] ]
- ];
-
- expected = [
- [],
- [],
- [],
- [ 0 ],
- [ 0 ],
- [ 0, 0 ],
- [ 0, 0 ],
- [ 1, 0 ],
- [ 0, 1 ],
- [ 3, 3 ],
- [ 3, 3 ]
- ];
-
- for ( i = 0; i < values.length; i++ ) {
- actual = broadcastShapes( values[ i ] );
- t.deepEqual( actual, expected[ i ], 'returns expected value. Actual: ('+actual.join( ',' )+'). Expected: ('+expected[ i ].join( ',' )+').' );
- }
- t.end();
-});
-
-tape( 'the function broadcasts array shapes to a single shape (single shape)', function test( t ) {
- var expected;
- var actual;
- var values;
- var i;
-
- values = [
- [ [ 7 ] ],
- [ [ 1, 1 ] ],
- [ [ 5, 6, 1 ] ]
- ];
-
- expected = [
- [ 7 ],
- [ 1, 1 ],
- [ 5, 6, 1 ]
- ];
-
- for ( i = 0; i < values.length; i++ ) {
- actual = broadcastShapes( values[ i ] );
- t.deepEqual( actual, expected[ i ], 'returns expected value. Actual: ('+actual.join( ',' )+'). Expected: ('+expected[ i ].join( ',' )+').' );
- }
- t.end();
-});
-
-tape( 'the function returns `null` if provided incompatible shapes', function test( t ) {
- var actual;
- var values;
- var i;
-
- values = [
- [ [ 3 ], [ 4 ] ],
- [ [ 2, 3 ], [ 2 ] ],
- [ [ 3 ], [ 3 ], [ 4 ] ],
- [ [ 1, 3, 4 ], [ 2, 3, 3 ] ],
- [ [ 1, 2 ], [ 3, 1 ], [ 3, 2 ], [ 10, 5 ] ],
- [ [ 2 ], [ 2, 3 ] ],
- [ [ 2 ], [ 2 ], [ 2 ], [ 2 ], [ 3 ], [ 3 ], [ 3 ], [ 3 ] ],
- [ [ 9, 0, 9 ], [ 0, 9, 0 ] ],
- [ [ 9, 9, 9 ], [ 0, 9, 9 ] ],
- [ [ 9, 0, 9 ], [ 9, 9, 9 ] ],
- [ [ 9, 9, 9 ], [ 9, 9, 0 ] ]
- ];
-
- for ( i = 0; i < values.length; i++ ) {
- actual = broadcastShapes( values[ i ] );
- t.strictEqual( actual, null, 'returns expected value. i: '+i+'.' );
- }
- t.end();
-});