diff --git a/.github/labeler.yml b/.github/labeler.yml index 8b9a45c415a..1408cbda313 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -20,6 +20,10 @@ BLAS: - changed-files: - any-glob-to-all-files: '**/blas/**/*' +LAPACK: +- changed-files: + - any-glob-to-all-files: '**/lapack/**/*' + Math: - changed-files: - any-glob-to-all-files: '**/math/**/*' diff --git a/.github/workflows/autoclose.yml b/.github/workflows/autoclose.yml new file mode 100644 index 00000000000..fe76d616251 --- /dev/null +++ b/.github/workflows/autoclose.yml @@ -0,0 +1,181 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2024 The Stdlib Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT 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: autclose + +# Workflow triggers: +on: + pull_request_target: + types: + - labeled + +# Workflow jobs: +jobs: + + # Define a job which closes a pull request if a contributor failed to setup EditorConfig: + editorconfig: + + # Define job name: + name: 'Check for EditorConfig label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: EditorConfig' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow our [contributing guidelines](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md). + + Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should download and setup [EditorConfig](http://editorconfig.org/) to ensure that files are automatically configured to use expected indentation and line endings. + + If you would prefer to avoid manual setup, you could also consider using a pre-configured [development container](https://github.com/stdlib-js/stdlib/tree/develop/.devcontainer) for use locally or in GitHub Codespaces. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Define a job which closes a pull request if a contributor failed to follow contributing guidelines: + contributor_guidelines: + + # Define job name: + name: 'Check for contributor guidelines label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: Contributor Guidelines' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow our [contributing guidelines](https://github.com/stdlib-js/stdlib/blob/develop/CONTRIBUTING.md). + + Per the guidelines outlined in our [development guide](https://github.com/stdlib-js/stdlib/blob/develop/docs/development.md), you should have setup your local development environment such that automated development processes for linting, license verification, and unit testing can run prior to authoring commits and pushing changes. We encourage you to refer to that guide **before** continuing to work on this pull request. + + If you would prefer to avoid manual setup, you could also consider using a pre-configured [development container](https://github.com/stdlib-js/stdlib/tree/develop/.devcontainer) for use locally or in GitHub Codespaces. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Define a job which closes a pull request if a contributor failed to follow project conventions: + project_conventions: + + # Define job name: + name: 'Check for project conventions label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: Project Conventions' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not follow project conventions. + + We place a high value on consistency throughout the stdlib codebase, and this pull request was found to significantly deviate from stdlib conventions. We encourage you to closely examine other packages in stdlib and attempt to emulate the practices and conventions found therein. + + - If you are attempting to contribute a new package, sometimes the best approach is to simply copy the contents of an existing package and then modify the minimum amount necessary to implement the feature (e.g., changing descriptions, parameter names, and implementation). + - If you are contributing tests, find a package implementing a similar feature and emulate the tests of that package. + - If you are updating documentation, examine several similar packages and emulate the content, style, and prose of those packages. + + In short, the more effort you put in to ensure that your contribution looks and feels like stdlib—including variables names, bracket spacing, line breaks, etc—the more likely that your contribution will be reviewed and ultimately accepted. We encourage you to closely study the codebase **before** continuing to work on this pull request. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Define a job which closes a pull request if a pull request is considered spam: + spam: + + # Define job name: + name: 'Check for spam label' + + # Only run this job if the pull request has a specific label: + if: "${{ github.event.label.name == 'autoclose: Spam' }}" + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Close the pull request: + - name: 'Close pull request' + run: gh pr close "$NUMBER" --comment "$BODY" + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} + BODY: | + Thank you for working on this pull request. However, we cannot accept your contribution as this pull request does not meet the standards of this project. + + Thank you again for your interest in stdlib, and we look forward to reviewing your future contriubtions. + + # Lock pull request conversation: + - name: 'Lock conversation' + run: gh pr lock "$NUMBER" --reason spam + env: + GH_TOKEN: ${{ secrets.STDLIB_BOT_GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + NUMBER: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/check_contributing_guidelines_acceptance.yml b/.github/workflows/check_contributing_guidelines_acceptance.yml index 53b3ad594bc..8ab5ec614e1 100755 --- a/.github/workflows/check_contributing_guidelines_acceptance.yml +++ b/.github/workflows/check_contributing_guidelines_acceptance.yml @@ -40,7 +40,9 @@ on: # Trigger on pull request events: pull_request_target: - types: [opened, reopened] + types: + - opened + - reopened # Global permissions: permissions: diff --git a/.github/workflows/check_licenses.yml b/.github/workflows/check_licenses.yml index 81fb2ccd78e..27b84d46300 100644 --- a/.github/workflows/check_licenses.yml +++ b/.github/workflows/check_licenses.yml @@ -20,7 +20,7 @@ name: check_licenses # Workflow triggers: -on: [pull_request] +on: [ pull_request ] # Global permissions: permissions: diff --git a/.github/workflows/check_required_files.yml b/.github/workflows/check_required_files.yml index 5e4d2f4d6f6..bd04a98adb6 100644 --- a/.github/workflows/check_required_files.yml +++ b/.github/workflows/check_required_files.yml @@ -32,6 +32,7 @@ on: user: required: true type: string + # Define the secrets accessible by the workflow: secrets: STDLIB_BOT_GITHUB_TOKEN: diff --git a/.github/workflows/discussion_bot_response.yml b/.github/workflows/discussion_bot_response.yml deleted file mode 100644 index 99ca489c71b..00000000000 --- a/.github/workflows/discussion_bot_response.yml +++ /dev/null @@ -1,55 +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. -#/ - -# Workflow name: -name: discussion_bot_response - -# Workflow triggers: -on: - discussion: - types: [created] - -# Global permissions: -permissions: - # Allow read-only access to the repository contents: - contents: read - -# Workflow jobs: -jobs: - respond: - # FIXME: disabled until determination whether enabling this bot is desirable/helpful - if: false - - # Define a display name: - name: 'Respond to question' - - # Define the conditions under which the job should run: FIXME: un-comment if and when re-enabled - # if: github.event.discussion.category.name == 'stdlib-bot Q&A' - - # Define the type of virtual host machine: - runs-on: ubuntu-latest - - # Define the sequence of job steps: - steps: - # Run the chatbot action: - - name: 'Run chatbot action' - # Pin action to full length commit SHA - uses: stdlib-js/stdlib-chat-bot@aaa9ebbeb4f4ec750bba5df5c152725bb84ee825 # v0.0.2 - with: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - GITHUB_TOKEN: ${{ secrets.CHATBOT_GITHUB_TOKEN }} diff --git a/.github/workflows/discussion_comment_bot_response.yml b/.github/workflows/discussion_comment_bot_response.yml deleted file mode 100644 index d554b961f49..00000000000 --- a/.github/workflows/discussion_comment_bot_response.yml +++ /dev/null @@ -1,55 +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. -#/ - -# Workflow name: -name: discussion_comment_bot_response - -# Workflow triggers: -on: - discussion_comment: - types: [created] - -# Global permissions: -permissions: - # Allow read-only access to the repository contents: - contents: read - -# Workflow jobs: -jobs: - respond: - # FIXME: disabled until determination whether enabling this bot is desirable/helpful - if: false - - # Define a display name: - name: 'Respond to question' - - # Define the conditions under which the job should run: FIXME: un-comment if and when re-enabled - # if: github.event.comment.body && startsWith( github.event.comment.body, '/ask ' ) - - # Define the type of virtual host machine: - runs-on: ubuntu-latest - - # Define the sequence of job steps: - steps: - # Run the chatbot action: - - name: 'Run chatbot action' - # Pin action to full length commit SHA - uses: stdlib-js/stdlib-chat-bot@aaa9ebbeb4f4ec750bba5df5c152725bb84ee825 # v0.0.2 - with: - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - GITHUB_TOKEN: ${{ secrets.CHATBOT_GITHUB_TOKEN }} diff --git a/.github/workflows/do_not_merge.yml b/.github/workflows/do_not_merge.yml new file mode 100644 index 00000000000..4f8154e8115 --- /dev/null +++ b/.github/workflows/do_not_merge.yml @@ -0,0 +1,60 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2024 The Stdlib Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT 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: do_not_merge + +# Workflow triggers: +on: + pull_request: + types: + - synchronize + - opened + - reopened + - labeled + - unlabeled + +# Workflow jobs: +jobs: + + # Define a job which fails a pull request if the pull request has a "Do Not Merge" label: + do_not_merge: + + # Define job name: + name: 'Check for Do Not Merge label' + + # Only run this job if the pull request has a "Do Not Merge" label: + if: ${{ contains(github.event.*.labels.*.name, 'Do Not Merge') }} + + # Define job permissions: + permissions: + contents: read + pull-requests: write + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Define the sequence of job steps: + steps: + + # Fail the pull request: + - name: 'Prevent merge' + run: | + echo "Pull request is labeled as 'Do Not Merge'." + echo "This workflow fails so that the pull request cannot be merged." + exit 1 diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 94e11706f07..4b4e5e3d41b 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -17,7 +17,7 @@ #/ # Workflow name: -name: 'labeler' +name: labeler # Workflow triggers: on: diff --git a/.github/workflows/lint_pr_title.yml b/.github/workflows/lint_pr_title.yml new file mode 100644 index 00000000000..14762164c4b --- /dev/null +++ b/.github/workflows/lint_pr_title.yml @@ -0,0 +1,91 @@ +#/ +# @license Apache-2.0 +# +# Copyright (c) 2024 The Stdlib Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT 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: lint_pr_title + +# Workflow triggers: +on: + pull_request: + types: + - synchronize + - opened + - reopened + +# Global permissions: +permissions: + # Allow read-only access to the repository contents: + contents: read + +# Workflow jobs: +jobs: + + # Define a job for linting PR titles... + lint_pr_title: + + # Define a display name: + name: 'Lint PR title' + + # Define the type of virtual host machine: + runs-on: ubuntu-latest + + # Set defaults: + defaults: + run: + # Set the default shell to `bash`: + shell: bash --noprofile --norc -eo pipefail {0} + + # Define the sequence of job steps... + steps: + + # Checkout the repository: + - name: 'Checkout repository' + # Pin action to full length commit SHA + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + with: + # Specify whether to remove untracked files before checking out the repository: + clean: false + + # Limit clone depth to the most recent 100 commits: + fetch-depth: 100 + + # Specify whether to download Git-LFS files: + lfs: false + timeout-minutes: 10 + + # Install Node.js: + - name: 'Install Node.js' + # Pin action to full length commit SHA + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 + with: + node-version: '20' # 'lts/*' + timeout-minutes: 5 + + # Perform install sequence (accounting for possible network failures, etc, when installing node module dependencies): + - name: 'Perform install sequence' + run: | + make install-node-modules || make install-node-modules || make install-node-modules + timeout-minutes: 30 + + # Perform linting: + - name: 'Perform linting' + run: | + echo "Pull request titles should follow stdlib's Git commit message conventions." + echo "Linting pull request title..." + make lint-commit-message GIT_COMMIT_MESSAGE='${{ github.event.pull_request.title }}' + timeout-minutes: 5 diff --git a/.github/workflows/slash_commands.yml b/.github/workflows/slash_commands.yml index c7724977892..8dc6c330990 100644 --- a/.github/workflows/slash_commands.yml +++ b/.github/workflows/slash_commands.yml @@ -22,7 +22,9 @@ name: slash_commands # Workflow triggers: on: issue_comment: - types: [created, edited] + types: + - created + - edited # Workflow jobs: jobs: diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/README.md b/lib/node_modules/@stdlib/blas/base/ssyr2/README.md new file mode 100644 index 00000000000..1901c5737ee --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/README.md @@ -0,0 +1,265 @@ + + +# ssyr2 + +> Perform the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`. + +
+ +## Usage + +```javascript +var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); +``` + +#### ssyr2( order, uplo, N, α, x, sx, y, sy, A, LDA ) + +Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +// A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +``` + +The function has the following parameters: + +- **order**: storage layout. +- **uplo**: specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced. +- **N**: number of elements along each dimension of `A`. +- **α**: scalar constant. +- **x**: first input [`Float32Array`][mdn-float32array]. +- **sx**: index increment for `x`. +- **y**: second input [`Float32Array`][mdn-float32array]. +- **sy**: index increment for `y`. +- **A**: input matrix stored in linear memory as a [`Float32Array`][mdn-float32array]. +- **lda**: stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`). + +The stride parameters determine how elements in the input arrays are accessed at runtime. For example, to iterate over every other element of `x`, + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0, 4.0, 5.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 2, y, 1, A, 3 ); +// A => [ 3.0, 7.0, 11.0, 0.0, 13.0, 21.0, 0.0, 0.0, 31.0 ] +``` + +Note that indexing is relative to the first index. To introduce an offset, use [`typed array`][mdn-typed-array] views. + + + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +// Initial arrays... +var x0 = new Float32Array( [ 0.0, 1.0, 1.0, 1.0 ] ); +var y0 = new Float32Array( [ 0.0, 1.0, 2.0, 3.0 ] ); +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); + +// Create offset views... +var x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element +var y1 = new Float32Array( y0.buffer, y0.BYTES_PER_ELEMENT*1 ); // start at 2nd element + +ssyr2( 'row-major', 'upper', 3, 1.0, x1, 1, y1, 1, A, 3 ); +// A => [ 3.0, 5.0, 7.0, 0.0, 5.0, 7.0, 0.0, 0.0, 7.0 ] +``` + +#### ssyr2.ndarray( uplo, N, α, x, sx, ox, y, sy, oy, A, sa1, sa2, oa ) + +Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, using alternative indexing semantics and where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +// A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +``` + +The function has the following additional parameters: + +- **ox**: starting index for `x`. +- **oy**: starting index for `y`. +- **sa1**: stride of the first dimension of `A`. +- **sa2**: stride of the second dimension of `A`. +- **oa**: starting index for `A`. + +While [`typed array`][mdn-typed-array] views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example, + +```javascript +var Float32Array = require( '@stdlib/array/float32' ); + +var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); +var x = new Float32Array( [ 1.0, 2.0, 3.0, 4.0, 5.0 ] ); +var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + +ssyr2.ndarray( 'upper', 3, 1.0, x, -2, 4, y, 1, 0, A, 3, 1, 0 ); +// A => [ 11.0, 15.0, 19.0, 0.0, 13.0, 13.0, 0.0, 0.0, 7.0 ] +``` + +
+ + + +
+ +## Notes + +- `ssyr2()` corresponds to the [BLAS][blas] level 2 function [`ssyr2`][blas-ssyr2]. + +
+ + + +
+ +## Examples + + + +```javascript +var discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var ones = require( '@stdlib/array/ones' ); +var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); + +var opts = { + 'dtype': 'float32' +}; + +var N = 3; + +var A = ones( N*N, opts.dtype ); +var x = discreteUniform( N, -10.0, 10.0, opts ); +var y = discreteUniform( N, -10.0, 10.0, opts ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +console.log( A ); +``` + +
+ + + + + +* * * + +
+ +## C APIs + + + +
+ +
+ + + + + +
+ +### Usage + +```c +TODO +``` + +#### TODO + +TODO. + +```c +TODO +``` + +TODO + +```c +TODO +``` + +
+ + + + + +
+ +
+ + + + + +
+ +### Examples + +```c +TODO +``` + +
+ + + +
+ + + + + + + + + + + + + + diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js new file mode 100644 index 00000000000..265f486ca84 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.js @@ -0,0 +1,105 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var bench = require( '@stdlib/bench' ); +var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); +var ones = require( '@stdlib/array/ones' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var pkg = require( './../package.json' ).name; +var ssyr2 = require( './../lib/ssyr2.js' ); + + +// VARIABLES // + +var options = { + 'dtype': 'float32' +}; + + +// FUNCTIONS // + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} N - number of elements along each dimension +* @returns {Function} benchmark function +*/ +function createBenchmark( N ) { + var x = ones( N, options.dtype ); + var y = ones( N, options.dtype ); + var A = ones( N*N, options.dtype ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var z; + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + z = ssyr2( 'row-major', 'upper', N, 1.0, x, 1, y, 1, A, N ); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var min; + var max; + var N; + var f; + var i; + + min = 1; // 10^min + max = 6; // 10^max + + for ( i = min; i <= max; i++ ) { + N = floor( pow( pow( 10, i ), 1.0/2.0 ) ); + f = createBenchmark( N ); + bench( pkg+':size='+(N*N), f ); + } +} + +main(); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js new file mode 100644 index 00000000000..3ad7c35d797 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/benchmark/benchmark.ndarray.js @@ -0,0 +1,105 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var bench = require( '@stdlib/bench' ); +var isnanf = require( '@stdlib/math/base/assert/is-nanf' ); +var ones = require( '@stdlib/array/ones' ); +var pow = require( '@stdlib/math/base/special/pow' ); +var floor = require( '@stdlib/math/base/special/floor' ); +var pkg = require( './../package.json' ).name; +var ssyr2 = require( './../lib/ndarray.js' ); + + +// VARIABLES // + +var options = { + 'dtype': 'float32' +}; + + +// FUNCTIONS // + +/** +* Creates a benchmark function. +* +* @private +* @param {PositiveInteger} N - number of elements along each dimension +* @returns {Function} benchmark function +*/ +function createBenchmark( N ) { + var x = ones( N, options.dtype ); + var y = ones( N, options.dtype ); + var A = ones( N*N, options.dtype ); + return benchmark; + + /** + * Benchmark function. + * + * @private + * @param {Benchmark} b - benchmark instance + */ + function benchmark( b ) { + var z; + var i; + + b.tic(); + for ( i = 0; i < b.iterations; i++ ) { + z = ssyr2( 'upper', N, 1.0, x, 1, 0, y, 1, 0, A, N, 1, 0 ); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + } + b.toc(); + if ( isnanf( z[ i%z.length ] ) ) { + b.fail( 'should not return NaN' ); + } + b.pass( 'benchmark finished' ); + b.end(); + } +} + + +// MAIN // + +/** +* Main execution sequence. +* +* @private +*/ +function main() { + var min; + var max; + var N; + var f; + var i; + + min = 1; // 10^min + max = 6; // 10^max + + for ( i = min; i <= max; i++ ) { + N = floor( pow( pow( 10, i ), 1.0/2.0 ) ); + f = createBenchmark( N ); + bench( pkg+':ndarray:size='+(N*N), f ); + } +} + +main(); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt new file mode 100644 index 00000000000..d1191871895 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/repl.txt @@ -0,0 +1,127 @@ + +{{alias}}( order, uplo, N, α, x, sx, y, sy, A, lda ) + Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where + `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by + `N` symmetric matrix. + + Indexing is relative to the first index. To introduce an offset, use typed + array views. + + If `N` is equal to `0` or `α` is equal to `0`, the function returns `A` + unchanged. + + Parameters + ---------- + order: string + Row-major (C-style) or column-major (Fortran-style) order. Must be + either 'row-major' or 'column-major'. + + uplo: string + Specifies whether to reference the upper or lower triangular part of + `A`. Must be either 'upper' or 'lower'. + + N: integer + Number of elements along each dimension of `A`. + + α: number + Scalar constant. + + x: Float32Array + First input vector. + + sx: integer + Index increment for `x`. + + y: Float32Array + Second input vector. + + sy: integer + Index increment for `y`. + + A: Float32Array + Matrix. + + lda: integer + Stride of the first dimension of `A` (a.k.a., leading dimension of the + matrix `A`). + + Returns + ------- + A: Float32Array + Input matrix. + + Examples + -------- + > var x = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var y = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var A = new {{alias:@stdlib/array/float32}}( [ 1.0, 2.0, 0.0, 2.0 ] ); + > {{alias}}( 'row-major', 'upper', 2, 1.0, x, 1, y, 1, A, 2 ) + [ 3.0, 4.0, 0.0, 4.0 ] + + +{{alias}}.ndarray( uplo, N, α, x, sx, ox, y, sy, oy, A, sa1, sa2, oa ) + Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, using + alternative indexing semantics and where `α` is a scalar, `x` and `y` are + `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + + While typed array views mandate a view offset based on the underlying + buffer, the offset parameters support indexing semantics based on starting + indices. + + Parameters + ---------- + uplo: string + Specifies whether to reference the upper or lower triangular part of + `A`. Must be either 'upper' or 'lower'. + + N: integer + Number of elements along each dimension of `A`. + + α: number + Scalar constant. + + x: Float32Array + First input vector. + + sx: integer + Index increment for `x`. + + ox: integer + Starting index for `x`. + + y: Float32Array + Second input vector. + + sy: integer + Index increment for `y`. + + oy: integer + Starting index for `y`. + + A: Float32Array + Matrix. + + sa1: integer + Stride of the first dimension of `A`. + + sa2: integer + Stride of the second dimension of `A`. + + oa: integer + Starting index for `A`. + + Returns + ------- + A: Float32Array + Input matrix. + + Examples + -------- + > var x = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var y = new {{alias:@stdlib/array/float32}}( [ 1.0, 1.0 ] ); + > var A = new {{alias:@stdlib/array/float32}}( [ 1.0, 2.0, 0.0, 2.0 ] ); + > {{alias}}.ndarray( 'upper', 2, 1.0, x, 1, 0, y, 1, 0, A, 2, 1, 0 ) + [ 3.0, 4.0, 0.0, 4.0 ] + + See Also + -------- diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts new file mode 100644 index 00000000000..e83667158e2 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/index.d.ts @@ -0,0 +1,127 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 { Layout, MatrixTriangle } from '@stdlib/types/blas'; + +/** +* Interface describing `ssyr2`. +*/ +interface Routine { + /** + * Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + * + * @param order - storage layout + * @param uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced + * @param N - number of elements along each dimension in the matrix `A` + * @param alpha - scalar constant + * @param x - first input array + * @param strideX - `x` stride length + * @param y - second input array + * @param strideY - `y` stride length + * @param A - matrix + * @param LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) + * @returns `A` + * + * @example + * var Float32Array = require( '@stdlib/array/float32' ); + * + * var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] + * var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * + * ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); + * // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] + */ + ( order: Layout, uplo: MatrixTriangle, N: number, alpha: number, x: Float32Array, strideX: number, y: Float32Array, strideY: number, A: Float32Array, LDA: number ): Float32Array; + + /** + * Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`, using alternative indexing semantics and where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. + * + * @param uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced + * @param N - number of elements along each dimension in the matrix `A` + * @param alpha - scalar constant + * @param x - first input array + * @param strideX - `x` stride length + * @param offsetX - starting index for `x` + * @param y - second input array + * @param strideY - `y` stride length + * @param offsetY - starting index for `y` + * @param A - matrix + * @param strideA1 - stride of the first dimension of `A` + * @param strideA2 - stride of the second dimension of `A` + * @param offsetA - starting index for `A` + * @returns `A` + * + * @example + * var Float32Array = require( '@stdlib/array/float32' ); + * + * var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] + * var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); + * + * ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); + * // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] + */ + ndarray( uplo: MatrixTriangle, N: number, alpha: number, x: Float32Array, strideX: number, offsetX: number, y: Float32Array, strideY: number, offsetY: number, A: Float32Array, strideA1: number, strideA2: number, offsetA: number ): Float32Array; +} + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @param order - storage layout +* @param uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param N - number of elements along each dimension in the matrix `A` +* @param alpha - scalar constant +* @param x - first input array +* @param strideX - `x` stride length +* @param y - second input array +* @param strideY - `y` stride length +* @param A - matrix +* @param LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) +* @returns `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ] ); +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'column-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +* // A => [ 3.0, 0.0, 0.0, 6.0, 9.0, 0.0, 9.0, 14.0, 19.0 ] +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 1.0, 1.0, 0.0, 2.0, 2.0, 0.0, 0.0, 3.0 ] ); +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 1, 3, 0 ); +* // A => [ 3.0, 0.0, 0.0, 6.0, 9.0, 0.0, 9.0, 14.0, 19.0 ] +*/ +declare var ssyr2: Routine; + + +// EXPORTS // + +export = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts new file mode 100644 index 00000000000..bd160723ebc --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/docs/types/test.ts @@ -0,0 +1,450 @@ +/* +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 ssyr2 = require( './index' ); + + +// TESTS // + +// The function returns a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectType Float32Array +} + +// The compiler throws an error if the function is provided a first argument which is not a string... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 10, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( true, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( false, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( null, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( undefined, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( [], 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( {}, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( ( x: number ): number => x, 'upper', 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a second argument which is not a string... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 10, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', true, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', false, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', null, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', undefined, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', [ '1' ], 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', {}, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', ( x: number ): number => x, 10, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a third argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', '10', 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', true, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', false, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', null, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', undefined, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', [], 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', {}, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', ( x: number ): number => x, 1.0, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fourth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, '10', x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, true, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, false, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, null, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, undefined, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, [], x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, {}, x, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, ( x: number ): number => x, x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fifth argument which is not a Float32Array... +{ + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, 10, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, '10', 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, true, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, false, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, null, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, undefined, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, [ '1' ], 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, {}, 1, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, ( x: number ): number => x, 1, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a sixth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, '10', y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, true, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, false, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, null, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, undefined, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, [], y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, {}, y, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, ( x: number ): number => x, y, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a seventh argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, 10, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, '10', 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, true, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, false, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, null, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, undefined, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, [ '1' ], 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, {}, 1, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, ( x: number ): number => x, 1, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided an eighth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, '10', A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, true, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, false, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, null, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, undefined, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, [], A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, {}, A, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, ( x: number ): number => x, A, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a ninth argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, 10, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, '10', 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, true, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, false, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, null, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, undefined, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, [ '1' ], 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, {}, 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, ( x: number ): number => x, 10 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a tenth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, '10' ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, true ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, false ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, null ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, undefined ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, [] ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, {} ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, ( x: number ): number => x ); // $ExpectError +} + +// The compiler throws an error if the function is provided an unsupported number of arguments... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2(); // $ExpectError + ssyr2( 'row-major' ); // $ExpectError + ssyr2( 'row-major', 'upper' ); // $ExpectError + ssyr2( 'row-major', 'upper', 10 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1 ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A ); // $ExpectError + ssyr2( 'row-major', 'upper', 10, 1.0, x, 1, y, 1, A, 10, 1 ); // $ExpectError +} + +// Attached to main export is an `ndarray` method which returns a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectType Float32Array +} + +// The compiler throws an error if the function is provided a first argument which is not a string... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 10, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( true, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( false, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( null, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( undefined, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( [ '1' ], 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( {}, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( ( x: number ): number => x, 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a second argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', '10', 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', true, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', false, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', null, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', undefined, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', [], 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', {}, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', ( x: number ): number => x, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a third argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, '10', x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, true, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, false, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, null, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, undefined, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, [], x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, {}, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, ( x: number ): number => x, x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fourth argument which is not a Float32Array... +{ + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, 10, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, '10', 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, true, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, false, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, null, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, undefined, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, [ '1' ], 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, {}, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, ( x: number ): number => x, 1, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a fifth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, '10', 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, true, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, false, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, null, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, undefined, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, [], 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, {}, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, ( x: number ): number => x, 0, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a sixth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, '10', y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, true, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, false, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, null, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, undefined, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, [], y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, {}, y, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, ( x: number ): number => x, y, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a seventh argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, 10, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, '10', 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, true, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, false, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, null, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, undefined, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, [ '1' ], 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, {}, 1, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, ( x: number ): number => x, 1, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided an eighth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, '10', 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, true, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, false, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, null, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, undefined, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, [], 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, {}, 0, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, ( x: number ): number => x, 0, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a ninth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, '10', A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, true, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, false, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, null, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, undefined, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, [], A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, {}, A, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, ( x: number ): number => x, A, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a tenth argument which is not a Float32Array... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, 10, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, '10', 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, true, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, false, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, null, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, undefined, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, [ '1' ], 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, {}, 10, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, ( x: number ): number => x, 10, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided an eleventh argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, '10', 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, true, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, false, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, null, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, undefined, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, [], 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, {}, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, ( x: number ): number => x, 1, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a twelfth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, '10', 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, true, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, false, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, null, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, undefined, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, [], 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, {}, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, ( x: number ): number => x, 0 ); // $ExpectError +} + +// The compiler throws an error if the function is provided a thirteenth argument which is not a number... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, '10' ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, true ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, false ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, null ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, undefined ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, [] ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, {} ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, ( x: number ): number => x ); // $ExpectError +} + +// The compiler throws an error if the `ndarray` method is provided an unsupported number of arguments... +{ + const x = new Float32Array( 10 ); + const y = new Float32Array( 10 ); + const A = new Float32Array( 20 ); + + ssyr2.ndarray(); // $ExpectError + ssyr2.ndarray(); // $ExpectError + ssyr2.ndarray( 'upper' ); // $ExpectError + ssyr2.ndarray( 'upper', 10 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1 ); // $ExpectError + ssyr2.ndarray( 'upper', 10, 1.0, x, 1, 0, y, 1, 0, A, 10, 1, 0, 10 ); // $ExpectError +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js b/lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js new file mode 100644 index 00000000000..107de2f608e --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/examples/index.js @@ -0,0 +1,36 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 discreteUniform = require( '@stdlib/random/array/discrete-uniform' ); +var ones = require( '@stdlib/array/ones' ); +var ssyr2 = require( './../lib' ); + +var opts = { + 'dtype': 'float32' +}; + +var N = 3; + +var A = ones( N*N, opts.dtype ); +var x = discreteUniform( N, -10.0, 10.0, opts ); +var y = discreteUniform( N, -10.0, 10.0, opts ); + +ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +console.log( A ); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js new file mode 100644 index 00000000000..ff990d7755c --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/base.js @@ -0,0 +1,133 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 isRowMajor = require( '@stdlib/ndarray/base/assert/is-row-major' ); +var f32 = require( '@stdlib/number/float64/base/to-float32' ); + + +// MAIN // + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @private +* @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param {NonNegativeInteger} N - number of elements along each dimension of `A` +* @param {number} alpha - scalar +* @param {Float32Array} x - first input vector +* @param {integer} strideX - `x` stride length +* @param {NonNegativeInteger} offsetX - starting index for `x` +* @param {Float32Array} y - second input vector +* @param {integer} strideY - `y` stride length +* @param {NonNegativeInteger} offsetY - starting index for `y` +* @param {Float32Array} A - input matrix +* @param {integer} strideA1 - stride of the first dimension of `A` +* @param {integer} strideA2 - stride of the second dimension of `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` +* @returns {Float32Array} `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ +function ssyr2( uplo, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ) { // eslint-disable-line max-len, max-params + var tmp1; + var tmp2; + var isrm; + var ix0; + var ix1; + var iy0; + var iy1; + var sa0; + var sa1; + var i0; + var i1; + var oa; + var ox; + var oy; + + isrm = isRowMajor( [ strideA1, strideA2 ] ); + if ( isrm ) { // row-major + // For row-major matrices, the last dimension has the fastest changing index... + sa0 = strideA2; // stride for innermost loop + sa1 = strideA1; // stride for outermost loop + } else { // column-major + // For column-major matrices, the first dimension has the fastest changing index... + sa0 = strideA1; // stride for innermost loop + sa1 = strideA2; // stride for outermost loop + } + ox = offsetX; + oy = offsetY; + ix1 = ox; + iy1 = oy; + if ( + ( isrm && uplo === 'lower' ) || + ( !isrm && uplo === 'upper' ) + ) { + for ( i1 = 0; i1 < N; i1++ ) { + if ( ( x[ ix1 ] !== 0.0 ) || ( y[ iy1 ] !== 0.0 ) ) { + tmp1 = f32( alpha * y[ iy1 ] ); + tmp2 = f32( alpha * x[ ix1 ] ); + oa = offsetA + (sa1*i1); + ix0 = ox; + iy0 = oy; + for ( i0 = 0; i0 <= i1; i0++ ) { + A[ oa+(sa0*i0) ] += f32( f32( x[ ix0 ] * tmp1 ) + f32( y[ iy0 ] * tmp2 ) ); // eslint-disable-line max-len + ix0 += strideX; + iy0 += strideY; + } + } + ix1 += strideX; + iy1 += strideY; + } + return A; + } + // ( isrm && uplo === 'upper' ) || ( !isrm && uplo === 'lower' ) + for ( i1 = 0; i1 < N; i1++ ) { + if ( ( x[ ix1 ] !== 0.0 ) || ( y[ iy1 ] !== 0.0 ) ) { + tmp1 = f32( alpha * y[ iy1 ] ); + tmp2 = f32( alpha * x[ ix1 ] ); + oa = offsetA + (sa1*i1); + ix0 = ix1; + iy0 = iy1; + for ( i0 = i1; i0 < N; i0++ ) { + A[ oa+(sa0*i0) ] += f32( f32( x[ ix0 ] * tmp1 ) + f32( y[ iy0 ] * tmp2 ) ); // eslint-disable-line max-len + ix0 += strideX; + iy0 += strideY; + } + } + ix1 += strideX; + iy1 += strideY; + } + return A; +} + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js new file mode 100644 index 00000000000..d7c735e345f --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/index.js @@ -0,0 +1,72 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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'; + +/** +* BLAS level 2 routine to perform the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @module @stdlib/blas/base/ssyr2 +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* var ssyr2 = require( '@stdlib/blas/base/ssyr2' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2.ndarray( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ + +// MODULES // + +var join = require( 'path' ).join; +var tryRequire = require( '@stdlib/utils/try-require' ); +var isError = require( '@stdlib/assert/is-error' ); +var main = require( './main.js' ); + + +// MAIN // + +var ssyr2; +var tmp = tryRequire( join( __dirname, './native.js' ) ); +if ( isError( tmp ) ) { + ssyr2 = main; +} else { + ssyr2 = tmp; +} + + +// EXPORTS // + +module.exports = ssyr2; + +// exports: { "ndarray": "ssyr2.ndarray" } diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js new file mode 100644 index 00000000000..514776b5252 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/main.js @@ -0,0 +1,35 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 setReadOnly = require( '@stdlib/utils/define-nonenumerable-read-only-property' ); +var ssyr2 = require( './ssyr2.js' ); +var ndarray = require( './ndarray.js' ); + + +// MAIN // + +setReadOnly( ssyr2, 'ndarray', ndarray ); + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js new file mode 100644 index 00000000000..baba2433b76 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ndarray.js @@ -0,0 +1,84 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 isMatrixTriangle = require( '@stdlib/blas/base/assert/is-matrix-triangle' ); +var format = require( '@stdlib/string/format' ); +var base = require( './base.js' ); + + +// MAIN // + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param {NonNegativeInteger} N - number of elements along each dimension of `A` +* @param {number} alpha - scalar +* @param {Float32Array} x - first input vector +* @param {integer} strideX - `x` stride length +* @param {NonNegativeInteger} offsetX - starting index for `x` +* @param {Float32Array} y - second input vector +* @param {integer} strideY - `y` stride length +* @param {NonNegativeInteger} offsetY - starting index for `y` +* @param {Float32Array} A - input matrix +* @param {integer} strideA1 - stride of the first dimension of `A` +* @param {integer} strideA2 - stride of the second dimension of `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` +* @throws {TypeError} first argument must specify whether to reference the lower or upper triangular matrix +* @throws {RangeError} second argument must be a nonnegative integer +* @throws {RangeError} fifth argument must be non-zero +* @throws {RangeError} eighth argument must be non-zero +* @returns {Float32Array} `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'upper', 3, 1.0, x, 1, 0, y, 1, 0, A, 3, 1, 0 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ +function ssyr2( uplo, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ) { // eslint-disable-line max-len, max-params + if ( !isMatrixTriangle( uplo ) ) { + throw new TypeError( format( 'invalid argument. First argument must specify whether the reference the lower or upper triangular matrix. Value: `%s`.', uplo ) ); + } + if ( N < 0 ) { + throw new RangeError( format( 'invalid argument. Second argument must be a nonnegative integer. Value: `%d`.', N ) ); + } + if ( strideX === 0 ) { + throw new RangeError( format( 'invalid argument. Fifth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( strideY === 0 ) { + throw new RangeError( format( 'invalid argument. Eighth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( N === 0 || alpha === 0.0 ) { + return A; + } + return base( uplo, N, alpha, x, strideX, offsetX, y, strideY, offsetY, A, strideA1, strideA2, offsetA ); // eslint-disable-line max-len +} + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js new file mode 100644 index 00000000000..87adeb40c64 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/lib/ssyr2.js @@ -0,0 +1,105 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 max = require( '@stdlib/math/base/special/fast/max' ); +var isLayout = require( '@stdlib/blas/base/assert/is-layout' ); +var isMatrixTriangle = require( '@stdlib/blas/base/assert/is-matrix-triangle' ); +var stride2offset = require( '@stdlib/strided/base/stride2offset' ); +var format = require( '@stdlib/string/format' ); +var base = require( './base.js' ); + + +// MAIN // + +/** +* Performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` where `α` is a scalar, `x` and `y` are `N` element vectors, and `A` is an `N` by `N` symmetric matrix. +* +* @param {string} order - storage layout +* @param {string} uplo - specifies whether the upper or lower triangular part of the symmetric matrix `A` should be referenced +* @param {NonNegativeInteger} N - number of elements along each dimension of `A` +* @param {number} alpha - scalar +* @param {Float32Array} x - first input vector +* @param {integer} strideX - `x` stride length +* @param {Float32Array} y - second input vector +* @param {integer} strideY - `y` stride length +* @param {Float32Array} A - input matrix +* @param {integer} LDA - stride of the first dimension of `A` (a.k.a., leading dimension of the matrix `A`) +* @throws {TypeError} first argument must be a valid order +* @throws {TypeError} second argument must specify whether to reference the lower or upper triangular matrix +* @throws {RangeError} third argument must be a nonnegative integer +* @throws {RangeError} sixth argument must be non-zero +* @throws {RangeError} eighth argument must be greater than or equal to max(1,N) +* @returns {Float32Array} `A` +* +* @example +* var Float32Array = require( '@stdlib/array/float32' ); +* +* var A = new Float32Array( [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ] ); // => [ [ 1.0, 2.0, 3.0 ], [ 0.0, 1.0, 2.0 ], [ 0.0, 0.0, 1.0 ] ] +* var x = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* var y = new Float32Array( [ 1.0, 2.0, 3.0 ] ); +* +* ssyr2( 'row-major', 'upper', 3, 1.0, x, 1, y, 1, A, 3 ); +* // A => [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +*/ +function ssyr2( order, uplo, N, alpha, x, strideX, y, strideY, A, LDA ) { + var sa1; + var sa2; + var ox; + var oy; + + if ( !isLayout( order ) ) { + throw new TypeError( format( 'invalid argument. First argument must be a valid order. Value: `%s`.', order ) ); + } + if ( !isMatrixTriangle( uplo ) ) { + throw new TypeError( format( 'invalid argument. Second argument must specify whether to reference the lower or upper triangular matrix. Value: `%s`.', uplo ) ); + } + if ( N < 0 ) { + throw new RangeError( format( 'invalid argument. Third argument must be a nonnegative integer. Value: `%d`.', N ) ); + } + if ( strideX === 0 ) { + throw new RangeError( format( 'invalid argument. Sixth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( strideY === 0 ) { + throw new RangeError( format( 'invalid argument. Eighth argument must be non-zero. Value: `%d`.', strideX ) ); + } + if ( LDA < max( 1, N ) ) { + throw new RangeError( format( 'invalid argument. Tenth argument must be greater than or equal to max(1,%d). Value: `%d`.', N, LDA ) ); + } + if ( N === 0 || alpha === 0.0 ) { + return A; + } + if ( order === 'column-major' ) { + sa1 = 1; + sa2 = LDA; + } else { // order === 'row-major' + sa1 = LDA; + sa2 = 1; + } + ox = stride2offset( N, strideX ); + oy = stride2offset( N, strideY ); + return base( uplo, N, alpha, x, strideX, ox, y, strideY, oy, A, sa1, sa2, 0 ); // eslint-disable-line max-len +} + + +// EXPORTS // + +module.exports = ssyr2; diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/package.json b/lib/node_modules/@stdlib/blas/base/ssyr2/package.json new file mode 100644 index 00000000000..cf7b13d10bb --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/package.json @@ -0,0 +1,68 @@ +{ + "name": "@stdlib/blas/base/ssyr2", + "version": "0.0.0", + "description": "Perform the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A`.", + "license": "Apache-2.0", + "author": { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + }, + "contributors": [ + { + "name": "The Stdlib Authors", + "url": "https://github.com/stdlib-js/stdlib/graphs/contributors" + } + ], + "main": "./lib", + "directories": { + "benchmark": "./benchmark", + "doc": "./docs", + "example": "./examples", + "lib": "./lib", + "test": "./test" + }, + "types": "./docs/types", + "scripts": {}, + "homepage": "https://github.com/stdlib-js/stdlib", + "repository": { + "type": "git", + "url": "git://github.com/stdlib-js/stdlib.git" + }, + "bugs": { + "url": "https://github.com/stdlib-js/stdlib/issues" + }, + "dependencies": {}, + "devDependencies": {}, + "engines": { + "node": ">=0.10.0", + "npm": ">2.7.0" + }, + "os": [ + "aix", + "darwin", + "freebsd", + "linux", + "macos", + "openbsd", + "sunos", + "win32", + "windows" + ], + "keywords": [ + "stdlib", + "stdmath", + "mathematics", + "math", + "blas", + "level 2", + "ssyr2", + "linear", + "algebra", + "subroutines", + "array", + "ndarray", + "float32", + "float", + "float32array" + ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json new file mode 100644 index 00000000000..f6257986814 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_complex_access_pattern.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": -1, + "offsetX": 2, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0 ], + "strideA1": -2, + "strideA2": -10, + "offsetA": 29, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 6.0, 999.0, 9.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 14.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json new file mode 100644 index 00000000000..781a5a56fc1 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_l.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 1.0, 1.0, 0.0, 2.0, 2.0, 0.0, 0.0, 3.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 5.0, 9.0, 13.0, 0.0, 18.0, 26.0, 0.0, 0.0, 39.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json new file mode 100644 index 00000000000..b01a1efbe2a --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_oa.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 1.0, 1.0, 1.0, 999.0, 999.0, 0.0, 2.0, 2.0, 999.0, 999.0, 0.0, 0.0, 3.0, 999.0 ], + "strideA1": 1, + "strideA2": 5, + "offsetA": 1, + "A_out": [ 999.0, 5.0, 9.0, 13.0, 999.0, 999.0, 0.0, 18.0, 26.0, 999.0, 999.0, 0.0, 0.0, 39.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json new file mode 100644 index 00000000000..62cdc5b269d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0 ], + "strideA1": 2, + "strideA2": 10, + "offsetA": 5, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 6.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 14.0, 999.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json new file mode 100644 index 00000000000..d77b0e2955d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 0.0, 999.0, 0.0 ], + "strideA1": 2, + "strideA2": -10, + "offsetA": 25, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 14.0, 999.0, 19.0, 999.0, 999.0, 999.0, 999.0, 999.0, 6.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 0.0, 999.0, 0.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json new file mode 100644 index 00000000000..bd1fea14ca2 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0 ], + "strideA1": -2, + "strideA2": 10, + "offsetA": 9, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 6.0, 999.0, 999.0, 999.0, 999.0, 999.0, 19.0, 999.0, 14.0, 999.0, 9.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json new file mode 100644 index 00000000000..32e3298705a --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_sa1n_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0 ], + "strideA1": -2, + "strideA2": -10, + "offsetA": 29, + "A_out": [ 999.0, 999.0, 999.0, 999.0, 999.0, 19.0, 999.0, 14.0, 999.0, 9.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 6.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 3.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json new file mode 100644 index 00000000000..fac00d3bf1c --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_u.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 3.0, 0.0, 0.0, 6.0, 9.0, 0.0, 9.0, 14.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json new file mode 100644 index 00000000000..790473bbd53 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyn.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 31.0, 0.0, 0.0, 21.0, 13.0, 0.0, 11.0, 7.0, 3.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json new file mode 100644 index 00000000000..3cbe3d71e9a --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xnyp.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 11.0, 0.0, 0.0, 15.0, 13.0, 0.0, 19.0, 13.0, 7.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json new file mode 100644 index 00000000000..072dcef02fc --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyn.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 7.0, 0.0, 0.0, 13.0, 13.0, 0.0, 19.0, 15.0, 11.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json new file mode 100644 index 00000000000..d8685725d61 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/column_major_xpyp.json @@ -0,0 +1,18 @@ +{ + "order": "column-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 2.0, 1.0, 0.0, 3.0, 2.0, 1.0 ], + "lda": 3, + "strideA1": 1, + "strideA2": 3, + "offsetA": 0, + "A_out": [ 3.0, 0.0, 0.0, 7.0, 13.0, 0.0, 11.0, 21.0, 31.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json new file mode 100644 index 00000000000..5f837f8085e --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_complex_access_pattern.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": -1, + "offsetX": 2, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0 ], + "strideA1": -14, + "strideA2": -2, + "offsetA": 33, + "A_out": [ 999.0, 3.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 6.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 14.0, 999.0, 19.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json new file mode 100644 index 00000000000..c012cf3c408 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_l.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 0.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 5.0, 0.0, 0.0, 9.0, 18.0, 0.0, 13.0, 26.0, 39.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json new file mode 100644 index 00000000000..719ee5a0d02 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_oa.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "lower", + "N": 3, + "alpha": 2.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 999.0, 999.0, 1.0, 0.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 3.0, 999.0, 999.0, 999.0 ], + "strideA1": 3, + "strideA2": 1, + "offsetA": 3, + "A_out": [ 999.0, 999.0, 999.0, 5.0, 0.0, 0.0, 9.0, 18.0, 0.0, 13.0, 26.0, 39.0, 999.0, 999.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json new file mode 100644 index 00000000000..fca54b56fe4 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 1.0, 999.0 ], + "strideA1": 14, + "strideA2": 2, + "offsetA": 1, + "A_out": [ 999.0, 3.0, 999.0, 6.0, 999.0, 9.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 14.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 0.0, 999.0, 19.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json new file mode 100644 index 00000000000..b61992d216b --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0 ], + "strideA1": 14, + "strideA2": -2, + "offsetA": 5, + "A_out": [ 999.0, 9.0, 999.0, 6.0, 999.0, 3.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 14.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 19.0, 999.0, 0.0, 999.0, 0.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json new file mode 100644 index 00000000000..d57c31d8449 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 0.0, 999.0, 0.0, 999.0, 1.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 1.0, 999.0, 2.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 1.0, 999.0, 2.0, 999.0, 3.0, 999.0 ], + "strideA1": -14, + "strideA2": 2, + "offsetA": 29, + "A_out": [ 999.0, 0.0, 999.0, 0.0, 999.0, 19.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 0.0, 999.0, 9.0, 999.0, 14.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 6.0, 999.0, 9.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json new file mode 100644 index 00000000000..7233e480e28 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_sa1n_sa2n.json @@ -0,0 +1,17 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 999.0, 1.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 2.0, 999.0, 1.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 3.0, 999.0, 2.0, 999.0, 1.0, 999.0 ], + "strideA1": -14, + "strideA2": -2, + "offsetA": 33, + "A_out": [ 999.0, 19.0, 999.0, 0.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 14.0, 999.0, 9.0, 999.0, 0.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 999.0, 9.0, 999.0, 6.0, 999.0, 3.0, 999.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json new file mode 100644 index 00000000000..b499e7cb6e5 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_u.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0 ], + "strideX": 1, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 3.0, 6.0, 9.0, 0.0, 9.0, 14.0, 0.0, 0.0, 19.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json new file mode 100644 index 00000000000..95d3b0a50dd --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyn.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 31.0, 21.0, 11.0, 0.0, 13.0, 7.0, 0.0, 0.0, 3.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json new file mode 100644 index 00000000000..68d29ef3823 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xnyp.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": -2, + "offsetX": 4, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 11.0, 15.0, 19.0, 0.0, 13.0, 13.0, 0.0, 0.0, 7.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json new file mode 100644 index 00000000000..b1bf41bbbff --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyn.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": -1, + "offsetY": 2, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 7.0, 13.0, 19.0, 0.0, 13.0, 15.0, 0.0, 0.0, 11.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json new file mode 100644 index 00000000000..f9a3880cb2e --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/fixtures/row_major_xpyp.json @@ -0,0 +1,18 @@ +{ + "order": "row-major", + "uplo": "upper", + "N": 3, + "alpha": 1.0, + "x": [ 1.0, 2.0, 3.0, 4.0, 5.0 ], + "strideX": 2, + "offsetX": 0, + "y": [ 1.0, 2.0, 3.0 ], + "strideY": 1, + "offsetY": 0, + "A": [ 1.0, 2.0, 3.0, 0.0, 1.0, 2.0, 0.0, 0.0, 1.0 ], + "lda": 3, + "strideA1": 3, + "strideA2": 1, + "offsetA": 0, + "A_out": [ 3.0, 7.0, 11.0, 0.0, 13.0, 21.0, 0.0, 0.0, 31.0 ] +} diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js new file mode 100644 index 00000000000..334ed8b828f --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.js @@ -0,0 +1,82 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT 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 proxyquire = require( 'proxyquire' ); +var IS_BROWSER = require( '@stdlib/assert/is-browser' ); +var ssyr2 = require( './../lib' ); + + +// VARIABLES // + +var opts = { + 'skip': IS_BROWSER +}; + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof ssyr2, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'attached to the main export is a method providing an ndarray interface', function test( t ) { + t.strictEqual( typeof ssyr2.ndarray, 'function', 'method is a function' ); + t.end(); +}); + +tape( 'if a native implementation is available, the main export is the native implementation', opts, function test( t ) { + var ssyr2 = proxyquire( './../lib', { + '@stdlib/utils/try-require': tryRequire + }); + + t.strictEqual( ssyr2, mock, 'returns expected value' ); + t.end(); + + function tryRequire() { + return mock; + } + + function mock() { + // Mock... + } +}); + +tape( 'if a native implementation is not available, the main export is a JavaScript implementation', opts, function test( t ) { + var ssyr2; + var main; + + main = require( './../lib/ssyr2.js' ); + + ssyr2 = proxyquire( './../lib', { + '@stdlib/utils/try-require': tryRequire + }); + + t.strictEqual( ssyr2, main, 'returns expected value' ); + t.end(); + + function tryRequire() { + return new Error( 'Cannot find module' ); + } +}); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js new file mode 100644 index 00000000000..8bb9e87e537 --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ndarray.js @@ -0,0 +1,823 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var Float32Array = require( '@stdlib/array/float32' ); +var EPS = require( '@stdlib/constants/float32/eps' ); +var abs = require( '@stdlib/math/base/special/abs' ); +var ssyr2 = require( './../lib/ndarray.js' ); + + +// FIXTURES // + +var ru = require( './fixtures/row_major_u.json' ); +var rl = require( './fixtures/row_major_l.json' ); +var rxpyp = require( './fixtures/row_major_xpyp.json' ); +var rxnyp = require( './fixtures/row_major_xnyp.json' ); +var rxpyn = require( './fixtures/row_major_xpyn.json' ); +var rxnyn = require( './fixtures/row_major_xnyn.json' ); +var roa = require( './fixtures/row_major_oa.json' ); +var rsa1sa2 = require( './fixtures/row_major_sa1_sa2.json' ); +var rsa1nsa2 = require( './fixtures/row_major_sa1n_sa2.json' ); +var rsa1sa2n = require( './fixtures/row_major_sa1_sa2n.json' ); +var rsa1nsa2n = require( './fixtures/row_major_sa1n_sa2n.json' ); +var rcap = require( './fixtures/row_major_complex_access_pattern.json' ); + +var cu = require( './fixtures/column_major_u.json' ); +var cl = require( './fixtures/column_major_l.json' ); +var cxpyp = require( './fixtures/column_major_xpyp.json' ); +var cxnyp = require( './fixtures/column_major_xnyp.json' ); +var cxpyn = require( './fixtures/column_major_xpyn.json' ); +var cxnyn = require( './fixtures/column_major_xnyn.json' ); +var coa = require( './fixtures/column_major_oa.json' ); +var csa1sa2 = require( './fixtures/column_major_sa1_sa2.json' ); +var csa1nsa2 = require( './fixtures/column_major_sa1n_sa2.json' ); +var csa1sa2n = require( './fixtures/column_major_sa1_sa2n.json' ); +var csa1nsa2n = require( './fixtures/column_major_sa1n_sa2n.json' ); +var ccap = require( './fixtures/column_major_complex_access_pattern.json' ); + + +// FUNCTIONS // + +/** +* Tests for element-wise approximate equality. +* +* @private +* @param {Object} t - test object +* @param {Collection} actual - actual values +* @param {Collection} expected - expected values +* @param {number} rtol - relative tolerance +*/ +function isApprox( t, actual, expected, rtol ) { + var delta; + var tol; + var i; + + t.strictEqual( actual.length, expected.length, 'returns expected value' ); + for ( i = 0; i < expected.length; i++ ) { + if ( actual[ i ] === expected[ i ] ) { + t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); + } else { + delta = abs( actual[ i ] - expected[ i ] ); + tol = rtol * EPS * abs( expected[ i ] ); + t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); + } + } +} + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof ssyr2, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 13', function test( t ) { + t.strictEqual( ssyr2.length, 13, 'returns expected value' ); + t.end(); +}); + +tape( 'the function throws an error if provided an invalid first argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop' + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), TypeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( value, data.N, data.alpha, new Float32Array( data.x ), data.strideX, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid second argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + -1, + -2, + -3 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.uplo, value, data.alpha, new Float32Array( data.x ), data.strideX, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid fifth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.uplo, data.N, data.alpha, new Float32Array( data.x ), value, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid eighth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.uplo, data.N, data.alpha, new Float32Array( data.x ), value, data.offsetX, new Float32Array( data.y ), data.strideY, data.offsetY, new Float32Array( data.A ), data.strideA1, data.strideA2, data.offsetA ); + }; + } +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cu; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function returns a reference to the input matrix `A`', function test( t ) { + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.uplo, 0, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.uplo, data.N, 0.0, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.uplo, 0, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.uplo, data.N, 0.0, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function supports specifying the strides for the first and the second dimensions of `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1sa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying the strides for the first and the second dimensions of `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1sa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the first dimension of `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1nsa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the first dimension of `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1nsa2; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the second dimension of `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1sa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports a negative stride for the second dimension of `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1sa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports negative strides for `A` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rsa1nsa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports negative strides for `A` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = csa1nsa2n; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying an `A` offset (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = roa; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying an `A` offset (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = coa; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying `x` and `y` strides (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying `x` and `y` strides (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying negative strides for `x` and `y` (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying negative strides for `x` and `y` (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rcap; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = ccap; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.uplo, data.N, data.alpha, x, data.strideX, data.offsetX, y, data.strideY, data.offsetY, a, data.strideA1, data.strideA2, data.offsetA ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); diff --git a/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js new file mode 100644 index 00000000000..9c5bbe8e65d --- /dev/null +++ b/lib/node_modules/@stdlib/blas/base/ssyr2/test/test.ssyr2.js @@ -0,0 +1,589 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2024 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/* eslint-disable max-len */ + +'use strict'; + +// MODULES // + +var tape = require( 'tape' ); +var Float32Array = require( '@stdlib/array/float32' ); +var EPS = require( '@stdlib/constants/float32/eps' ); +var abs = require( '@stdlib/math/base/special/abs' ); +var ssyr2 = require( './../lib/ssyr2.js' ); + + +// FIXTURES // + +var ru = require( './fixtures/row_major_u.json' ); +var rl = require( './fixtures/row_major_l.json' ); +var rxpyp = require( './fixtures/row_major_xpyp.json' ); +var rxnyp = require( './fixtures/row_major_xnyp.json' ); +var rxpyn = require( './fixtures/row_major_xpyn.json' ); +var rxnyn = require( './fixtures/row_major_xnyn.json' ); + +var cu = require( './fixtures/column_major_u.json' ); +var cl = require( './fixtures/column_major_l.json' ); +var cxpyp = require( './fixtures/column_major_xpyp.json' ); +var cxnyp = require( './fixtures/column_major_xnyp.json' ); +var cxpyn = require( './fixtures/column_major_xpyn.json' ); +var cxnyn = require( './fixtures/column_major_xnyn.json' ); + + +// FUNCTIONS // + +/** +* Tests for element-wise approximate equality. +* +* @private +* @param {Object} t - test object +* @param {Collection} actual - actual values +* @param {Collection} expected - expected values +* @param {number} rtol - relative tolerance +*/ +function isApprox( t, actual, expected, rtol ) { + var delta; + var tol; + var i; + + t.strictEqual( actual.length, expected.length, 'returns expected value' ); + for ( i = 0; i < expected.length; i++ ) { + if ( actual[ i ] === expected[ i ] ) { + t.strictEqual( actual[ i ], expected[ i ], 'returns expected value' ); + } else { + delta = abs( actual[ i ] - expected[ i ] ); + tol = rtol * EPS * abs( expected[ i ] ); + t.ok( delta <= tol, 'within tolerance. actual: '+actual[ i ]+'. expected: '+expected[ i ]+'. delta: '+delta+'. tol: '+tol+'.' ); + } + } +} + + +// TESTS // + +tape( 'main export is a function', function test( t ) { + t.ok( true, __filename ); + t.strictEqual( typeof ssyr2, 'function', 'main export is a function' ); + t.end(); +}); + +tape( 'the function has an arity of 10', function test( t ) { + t.strictEqual( ssyr2.length, 10, 'returns expected value' ); + t.end(); +}); + +tape( 'the function throws an error if provided an invalid first argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop' + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), TypeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( value, data.uplo, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid second argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 'foo', + 'bar', + 'beep', + 'boop' + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), TypeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.order, value, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid third argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + -1, + -2, + -3 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.order, data.uplo, value, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid sixth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.order, data.uplo, data.N, data.alpha, new Float32Array( data.x ), value, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid eighth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 0 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.order, data.uplo, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), value, new Float32Array( data.A ), data.lda ); + }; + } +}); + +tape( 'the function throws an error if provided an invalid tenth argument', function test( t ) { + var values; + var data; + var i; + + data = ru; + + values = [ + 2, + 1, + 0, + -1, + -2, + -3 + ]; + + for ( i = 0; i < values.length; i++ ) { + t.throws( badValue( values[ i ] ), RangeError, 'throws an error when provided ' + values[ i ] ); + } + t.end(); + + function badValue( value ) { + return function badValue() { + ssyr2( data.order, data.uplo, data.N, data.alpha, new Float32Array( data.x ), data.strideX, new Float32Array( data.y ), data.strideY, new Float32Array( data.A ), value ); + }; + } +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, upper)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cu; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (row-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function performs the symmetric rank 2 operation `A = α*x*y^T + α*y*x^T + A` (column-major, lower)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function returns a reference to the input matrix `A`', function test( t ) { + var data; + var out; + var a; + var x; + var y; + + data = ru; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.order, data.uplo, 0, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.order, data.uplo, data.N, 0.0, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'if `N` is zero or the scalar constant is zero, the function returns the input matrix `A` unchanged (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cl; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A ); + + out = ssyr2( data.order, data.uplo, 0, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + out = ssyr2( data.order, data.uplo, data.N, 0.0, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + t.deepEqual( a, expected, 'returns expected value' ); + + t.end(); +}); + +tape( 'the function supports specifying strides (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying strides (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `x` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyp; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports specifying a negative `y` stride (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxpyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (row-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = rxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); + +tape( 'the function supports complex access patterns (column-major)', function test( t ) { + var expected; + var data; + var out; + var a; + var x; + var y; + + data = cxnyn; + + a = new Float32Array( data.A ); + x = new Float32Array( data.x ); + y = new Float32Array( data.y ); + + expected = new Float32Array( data.A_out ); + + out = ssyr2( data.order, data.uplo, data.N, data.alpha, x, data.strideX, y, data.strideY, a, data.lda ); + t.strictEqual( out, a, 'returns expected value' ); + isApprox( t, a, expected, 2.0 ); + + t.end(); +}); diff --git a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json index b47a3000a77..c4a950608ab 100644 --- a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json +++ b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/manifest.json @@ -41,9 +41,9 @@ "@stdlib/blas/ext/base/sapxsumkbn", "@stdlib/napi/export", "@stdlib/napi/argv", - "@stdlib/napi/argv_int64", - "@stdlib/napi/argv_strided_float32array", - "@stdlib/napi/argv_float" + "@stdlib/napi/argv-int64", + "@stdlib/napi/argv-strided-float32array", + "@stdlib/napi/argv-float" ] }, { diff --git a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c index adc8eccf26c..70d6754c744 100644 --- a/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c +++ b/lib/node_modules/@stdlib/blas/ext/base/sapxsum/src/addon.c @@ -16,7 +16,7 @@ * limitations under the License. */ -#include "stdlib/blas/base/sapxsum.h" +#include "stdlib/blas/ext/base/sapxsum.h" #include "stdlib/napi/export.h" #include "stdlib/napi/argv.h" #include "stdlib/napi/argv_float.h" diff --git a/lib/node_modules/@stdlib/lapack/base/README.md b/lib/node_modules/@stdlib/lapack/base/README.md index bb196bd19aa..79e59692499 100644 --- a/lib/node_modules/@stdlib/lapack/base/README.md +++ b/lib/node_modules/@stdlib/lapack/base/README.md @@ -46,6 +46,7 @@ The namespace contains the following:
- [`dlacpy( order, uplo, M, N, A, LDA, B, LDB )`][@stdlib/lapack/base/dlacpy]: copy all or part of a matrix `A` to another matrix `B`. +- [`dlassq( N, X, strideX, scale, sumsq )`][@stdlib/lapack/base/dlassq]: return an updated sum of squares represented in scaled form. - [`dlaswp( N, A, LDA, k1, k2, IPIV, incx )`][@stdlib/lapack/base/dlaswp]: perform a series of row interchanges on an input matrix. - [`dpttrf( N, D, E )`][@stdlib/lapack/base/dpttrf]: compute the `L * D * L^T` factorization of a real symmetric positive definite tridiagonal matrix `A`. @@ -92,6 +93,8 @@ console.log( objectKeys( lapack ) ); [@stdlib/lapack/base/dlacpy]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dlacpy +[@stdlib/lapack/base/dlassq]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dlassq + [@stdlib/lapack/base/dlaswp]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dlaswp [@stdlib/lapack/base/dpttrf]: https://github.com/stdlib-js/stdlib/tree/develop/lib/node_modules/%40stdlib/lapack/base/dpttrf diff --git a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js index 183fb4f6802..6eda3d563cc 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js +++ b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/base.js @@ -38,11 +38,11 @@ var min = require( '@stdlib/math/base/special/fast/min' ); * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example @@ -173,11 +173,11 @@ function copyAll( M, N, A, strideA1, strideA2, offsetA, B, strideB1, strideB2, o * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example @@ -289,11 +289,11 @@ function copyUpper( M, N, A, strideA1, strideA2, offsetA, B, strideB1, strideB2, * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example @@ -409,11 +409,11 @@ function copyLower( M, N, A, strideA1, strideA2, offsetA, B, strideB1, strideB2, * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example diff --git a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js index a4aee3e1018..66b722fcd1d 100644 --- a/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js +++ b/lib/node_modules/@stdlib/lapack/base/dlacpy/lib/ndarray.js @@ -34,11 +34,11 @@ var base = require( './base.js' ); * @param {Float64Array} A - input matrix * @param {integer} strideA1 - stride of the first dimension of `A` * @param {integer} strideA2 - stride of the second dimension of `A` -* @param {PositiveInteger} offsetA - starting index for `A` +* @param {NonNegativeInteger} offsetA - starting index for `A` * @param {Float64Array} B - output matrix * @param {integer} strideB1 - stride of the first dimension of `B` * @param {integer} strideB2 - stride of the second dimension of `B` -* @param {PositiveInteger} offsetB - starting index for `B` +* @param {NonNegativeInteger} offsetB - starting index for `B` * @returns {Float64Array} `B` * * @example diff --git a/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts b/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts index 4d5311c65a7..31df21c8eac 100644 --- a/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts +++ b/lib/node_modules/@stdlib/lapack/base/docs/types/index.d.ts @@ -21,6 +21,7 @@ /* eslint-disable max-lines */ import dlacpy = require( '@stdlib/lapack/base/dlacpy' ); +import dlassq = require( '@stdlib/lapack/base/dlassq' ); import dlaswp = require( '@stdlib/lapack/base/dlaswp' ); import dpttrf = require( '@stdlib/lapack/base/dpttrf' ); @@ -61,6 +62,35 @@ interface Namespace { */ dlacpy: typeof dlacpy; + /** + * Returns an updated sum of squares represented in scaled form. + * + * @param N - number of indexed elements + * @param X - input array + * @param strideX - stride length for `X` + * @param scale - scaling factor + * @param sumsq - basic sum of squares from which output is factored out + * @returns output array + * + * @example + * var Float64Array = require( '@stdlib/array/float64' ); + * + * var X = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); + * + * var out = ns.dlassq( 4, X, 1, 1.0, 0.0, out ); + * // returns [ 1.0, 30.0 ] + * + * @example + * var Float64Array = require( '@stdlib/array/float64' ); + * + * var X = new Float64Array( [ 1.0, 2.0, 3.0, 4.0 ] ); + * var out = new Float64Array( [ 0.0, 0.0 ] ); + * + * ns.dlassq.ndarray( 4, X, 1, 0, 1.0, 0.0, out, 1, 0 ); + * // out => [ 1.0, 30.0 ] + */ + dlassq: typeof dlassq; + /** * Performs a series of row interchanges on a matrix `A` using pivot indices stored in `IPIV`. * diff --git a/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js b/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js index 59242f690a1..3805c8dd285 100644 --- a/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js +++ b/lib/node_modules/@stdlib/math/base/special/gcd/benchmark/benchmark.native.js @@ -38,7 +38,7 @@ var opts = { // MAIN // -bench( pkg, opts, function benchmark( b ) { +bench( pkg+'::native', opts, function benchmark( b ) { var x; var y; var z; diff --git a/tools/make/lib/lint/git/Makefile b/tools/make/lib/lint/git/Makefile index d7e3d069ade..e6880432b0e 100644 --- a/tools/make/lib/lint/git/Makefile +++ b/tools/make/lib/lint/git/Makefile @@ -43,11 +43,11 @@ endif # @param {string} GIT_COMMIT_MESSAGE - Git commit message text # # @example -# make lint-commit-message +# make lint-commit-message GIT_COMMIT_MESSAGE='feat: add `foo/bar`' #/ lint-commit-message: ifeq ($(GIT_COMMIT_LINTER), commitlint) - $(QUIET) NODE_ENV="$(NODE_ENV)" NODE_PATH="$(NODE_PATH)" GIT_COMMIT_MESSAGE="$(GIT_COMMIT_MESSAGE)" $(MAKE) -f $(this_file) commitlint-message + $(QUIET) NODE_ENV="$(NODE_ENV)" NODE_PATH="$(NODE_PATH)" GIT_COMMIT_MESSAGE='$(GIT_COMMIT_MESSAGE)' $(MAKE) -f $(this_file) commitlint-message endif .PHONY: lint-commit-message diff --git a/tools/make/lib/lint/git/commitlint.mk b/tools/make/lib/lint/git/commitlint.mk index 5ab2f11f57f..18fa769c46d 100644 --- a/tools/make/lib/lint/git/commitlint.mk +++ b/tools/make/lib/lint/git/commitlint.mk @@ -92,10 +92,10 @@ commitlint: $(NODE_MODULES) commitlint-init # @private # # @example -# make commitlint-message +# make commitlint-message GIT_COMMIT_MESSAGE='feat: add `foo/bar`' #/ commitlint-message: $(NODE_MODULES) commitlint-init - $(QUIET) ( printf "$(GIT_COMMIT_MESSAGE)" | "$(COMMITLINT)" $(COMMITLINT_FLAGS) ) || ( $(MAKE) -f $(this_file) commitlint-cleanup && exit 1 ) + $(QUIET) ( printf '$(GIT_COMMIT_MESSAGE)' | "$(COMMITLINT)" $(COMMITLINT_FLAGS) ) || ( $(MAKE) -f $(this_file) commitlint-cleanup && exit 1 ) $(QUIET) $(MAKE) -f $(this_file) commitlint-cleanup .PHONY: commitlint-message