diff --git a/.github/.keepalive b/.github/.keepalive new file mode 100644 index 0000000..f2e5bb4 --- /dev/null +++ b/.github/.keepalive @@ -0,0 +1 @@ +2024-01-01T05:05:55.742Z diff --git a/README.md b/README.md index db77339..9fa39a4 100644 --- a/README.md +++ b/README.md @@ -191,14 +191,9 @@ For more information on the project, filing bug reports and feature requests, an --- -## License - -See [LICENSE][stdlib-license]. - - ## Copyright -Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. +Copyright © 2016-2024. The Stdlib [Authors][stdlib-authors]. @@ -239,8 +234,6 @@ Copyright © 2016-2023. The Stdlib [Authors][stdlib-authors]. [esm-url]: https://github.com/stdlib-js/ndarray-base-maybe-broadcast-arrays/tree/esm [branches-url]: https://github.com/stdlib-js/ndarray-base-maybe-broadcast-arrays/blob/main/branches.md -[stdlib-license]: https://raw.githubusercontent.com/stdlib-js/ndarray-base-maybe-broadcast-arrays/main/LICENSE - [@stdlib/ndarray/ctor]: https://github.com/stdlib-js/ndarray-ctor [@stdlib/ndarray/base/ctor]: https://github.com/stdlib-js/ndarray-base-ctor diff --git a/dist/index.js b/dist/index.js index 34f3911..900f742 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,5 +1,68 @@ -"use strict";var n=function(e,r){return function(){return r||e((r={exports:{}}).exports,r),r.exports}};var o=n(function(m,i){ -var v=require('@stdlib/ndarray-base-broadcast-shapes/dist'),p=require('@stdlib/ndarray-base-maybe-broadcast-array/dist'),c=require('@stdlib/ndarray-base-shape/dist');function h(e){var r,t,s,u,a;for(u=e.length,r=[],a=0;a +* +* var shx = x.shape; +* // returns [ 2, 2 ] +* +* var y1 = zeros( [ 3, 2, 2 ] ); +* // returns +* +* var shy = y1.shape; +* // returns [ 3, 2, 2 ] +* +* var out = maybeBroadcastArrays( [ x1, y1 ] ); +* // returns [ , ] +* +* var x2 = out[ 0 ]; +* // returns +* +* var y2 = out[ 1 ]; +* // returns +* +* shx = x2.shape; +* // returns [ 3, 2, 2 ] +* +* shy = y2.shape; +* // returns [ 3, 2, 2 ] +* +* var v = x2.get( 0, 0, 0 ); +* // returns 1 +* +* v = x2.get( 0, 0, 1 ); +* // returns 2 +* +* v = x2.get( 1, 0, 0 ); +* // returns 1 +* +* v = x2.get( 1, 1, 0 ); +* // returns 3 +* +* v = x2.get( 2, 0, 0 ); +* // returns 1 +* +* v = x2.get( 2, 1, 1 ); +* // returns 4 +*/ + +// MODULES // + +var main = require( './main.js' ); + + +// EXPORTS // + +module.exports = main; diff --git a/dist/main.js b/dist/main.js new file mode 100644 index 0000000..31443ba --- /dev/null +++ b/dist/main.js @@ -0,0 +1,133 @@ +/** +* @license Apache-2.0 +* +* Copyright (c) 2023 The Stdlib Authors. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +'use strict'; + +// MODULES // + +var broadcastShapes = require( '@stdlib/ndarray-base-broadcast-shapes' ); +var maybeBroadcastArray = require( '@stdlib/ndarray-base-maybe-broadcast-array' ); +var getShape = require( '@stdlib/ndarray-base-shape' ); + + +// MAIN // + +/** +* Broadcasts an ndarrays to a common shape. +* +* ## Notes +* +* - If a provided ndarray has a shape matching the common shape, the function returns the provided ndarray. +* - If a provided ndarray has a different (broadcast compatible) shape than the common shape, the function returns a new (base) ndarray view of the provided ndarray's data. The view is typically **not** contiguous. As more than one element of a returned view may refer to the same memory location, writing to a view may affect multiple elements. If you need to write to a returned array, copy the array before performing operations which may mutate elements. +* +* @param {ArrayLikeObject} arrays - list of input arrays +* @throws {Error} input arrays must be broadcast compatible +* @returns {Array} broadcasted arrays +* +* @example +* var array = require( '@stdlib/ndarray-array' ); +* var zeros = require( '@stdlib/ndarray-zeros' ); +* +* var x1 = array( [ [ 1, 2 ], [ 3, 4 ] ] ); +* // returns +* +* var shx = x1.shape; +* // returns [ 2, 2 ] +* +* var y1 = zeros( [ 3, 2, 2 ] ); +* // returns +* +* var shy = y1.shape; +* // returns [ 3, 2, 2 ] +* +* var out = maybeBroadcastArrays( [ x1, y1 ] ); +* // returns +* +* var x2 = out[ 0 ]; +* // returns +* +* var y2 = out[ 1 ]; +* // returns +* +* shx = x2.shape; +* // returns [ 3, 2, 2 ] +* +* shy = y2.shape; +* // returns [ 3, 2, 2 ] +* +* var v = x2.get( 0, 0, 0 ); +* // returns 1 +* +* v = x2.get( 0, 0, 1 ); +* // returns 2 +* +* v = x2.get( 1, 0, 0 ); +* // returns 1 +* +* v = x2.get( 1, 1, 0 ); +* // returns 3 +* +* v = x2.get( 2, 0, 0 ); +* // returns 1 +* +* v = x2.get( 2, 1, 1 ); +* // returns 4 +* +* @example +* var zeros = require( '@stdlib/ndarray-zeros' ); +* +* var x = zeros( [ 2, 2 ] ); +* // returns +* +* var y = zeros( [ 4, 2 ] ); +* // returns +* +* var out = maybeBroadcastArrays( [ x, y ] ); +* // throws +*/ +function maybeBroadcastArrays( arrays ) { + var shapes; + var out; + var sh; + var N; + var i; + + N = arrays.length; + + // Resolve the list of shapes... + shapes = []; + for ( i = 0; i < N; i++ ) { + shapes.push( getShape( arrays[ i ], false ) ); + } + // Broadcast the shapes to a common shape: + sh = broadcastShapes( shapes ); + if ( sh === null ) { + throw new Error( 'invalid arguments. Input arrays must be broadcast compatible.' ); + } + // Broadcast each array to the common shape... + out = []; + for ( i = 0; i < N; i++ ) { + out.push( maybeBroadcastArray( arrays[ i ], sh ) ); + } + return out; +} + + +// EXPORTS // + +module.exports = maybeBroadcastArrays;