Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add with method to array/complex64 #1246

Merged
merged 9 commits into from
Dec 31, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions lib/node_modules/@stdlib/array/complex64/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,36 @@ var str = arr.toString();
// returns '1 + 1i,2 - 2i,3 + 3i'
```

<a name="method-with"></a>

#### Complex128Array.prototype.with( index, value )

Returns a new typed array with the element at a provided index replaced with a provided value.

```javascript
var realf = require( '@stdlib/complex/realf' );
var imagf = require( '@stdlib/complex/imagf' );
var Complex64 = require( '@stdlib/complex/float32' );

var arr = new Complex64Array( 3 );

arr.set( [ 1.0, 1.0 ], 0 );
arr.set( [ 2.0, 2.0 ], 1 );
arr.set( [ 3.0, 3.0 ], 1 );

var out = arr.with( 0, new Complex64( 4.0, 4.0 ) );
// returns <Complex64Array>

var z = out.get( 0 );
// returns <Complex64>

var re = realf( z );
// returns 4.0

var im = imagf( z );
// returns 4.0
```

</section>

<!-- /.usage -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2023 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

// MODULES //

var bench = require( '@stdlib/bench' );
var Complex64 = require( '@stdlib/complex/float32' );
var isComplex64Array = require( '@stdlib/assert/is-complex64array' );
var pkg = require( './../package.json' ).name;
var Complex64Array = require( './../lib' );


// MAIN //

bench( pkg+':with', function benchmark( b ) {
var values;
var arr;
var out;
var i;

values = [
new Complex64( 1.0, 1.0 ),
new Complex64( 2.0, 2.0 ),
new Complex64( 3.0, 3.0 )
];
arr = new Complex64Array( 5 );

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
out = arr.with( i%arr.length, values[ i%values.length ] );
if ( typeof out !== 'object' ) {
b.fail( 'should return an object' );
}
}
b.toc();
if ( !isComplex64Array( out ) ) {
b.fail( 'should return a Complex64Array' );
}
b.pass( 'benchmark finished' );
b.end();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/**
* @license Apache-2.0
*
* Copyright (c) 2023 The Stdlib Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

'use strict';

// MODULES //

var bench = require( '@stdlib/bench' );
var pow = require( '@stdlib/math/base/special/pow' );
var Complex64 = require( '@stdlib/complex/float32' );
var isComplex64Array = require('@stdlib/assert/is-complex64array');
kgryte marked this conversation as resolved.
Show resolved Hide resolved
var pkg = require( './../package.json' ).name;
var Complex64Array = require( './../lib' );


// FUNCTIONS //

/**
* Creates a benchmark function.
*
* @private
* @param {PositiveInteger} len - array length
* @returns {Function} benchmark function
*/
function createBenchmark( len ) {
var arr = new Complex64Array( len );
return benchmark;

/**
* Benchmark function.
*
* @private
* @param {Benchmark} b - benchmark instance
*/
function benchmark( b ) {
var values;
var out;
var i;

values = [
new Complex64( 1.0, 1.0 ),
new Complex64( 2.0, 2.0 ),
new Complex64( 3.0, 3.0 )
];

b.tic();
for ( i = 0; i < b.iterations; i++ ) {
out = arr.with( i%len, values[ i%values.length ] );
if ( typeof out !== 'object' ) {
b.fail( 'should return an object' );
}
}
b.toc();
if ( !isComplex64Array( out ) ) {
b.fail( 'should return a Complex64Array' );
}
b.pass( 'benchmark finished' );
b.end();
}
}


// MAIN //

/**
* Main execution sequence.
*
* @private
*/
function main() {
var len;
var min;
var max;
var f;
var i;

min = 1; // 10^min
max = 6; // 10^max

for ( i = min; i <= max; i++ ) {
len = pow( 10, i );
f = createBenchmark( len );
bench( pkg+':with:len='+len, f );
}
}

main();
35 changes: 35 additions & 0 deletions lib/node_modules/@stdlib/array/complex64/docs/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -983,6 +983,41 @@ declare class Complex64Array implements Complex64ArrayInterface {
* // returns '1 + 1i,2 + 2i'
*/
toString(): string;

/**
* Returns new typed array with the element at index replaced with value.
kgryte marked this conversation as resolved.
Show resolved Hide resolved
*
* @param index - element index
* @param value - value to replace
kgryte marked this conversation as resolved.
Show resolved Hide resolved
* @throws first argument must be an integer
* @throws second argument must be a complex number
* @throws index argument is out-of-bounds
* @returns modified typed array
*
* @example
* var realf = require( '@stdlib/complex/realf' );
* var imagf = require( '@stdlib/complex/imagf' );
* var Complex64 = require( '@stdlib/complex/float32' );
*
* var arr = new Complex64Array( 3 );
*
* arr.set( [ 1.0, 1.0 ], 0 );
* arr.set( [ 2.0, 2.0 ], 1 );
* arr.set( [ 3.0, 3.0 ], 2 );
*
* var out = arr.with( 0, new Complex64( 4.0, 4.0 ) );
* // returns <Complex64Array>
*
* var z = out.get( 0 );
* // returns <Complex64>
*
* var re = realf( z );
* // returns 4.0
*
* var im = imagf( z );
* // returns 4.0
*/
with( index: number, value: ComplexLike ): Complex64Array;
kgryte marked this conversation as resolved.
Show resolved Hide resolved
}

/**
Expand Down
64 changes: 64 additions & 0 deletions lib/node_modules/@stdlib/array/complex64/lib/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@
* @param {*} value - value to test
* @returns {boolean} boolean indicating if a value is a `Complex64Array`
*/
function isComplex64Array( value ) { // TODO: move to array/base/assert/is-complex64-array

Check warning on line 110 in lib/node_modules/@stdlib/array/complex64/lib/main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

Unexpected 'todo' comment: 'TODO: move to...'
return (
typeof value === 'object' &&
value !== null &&
Expand All @@ -123,7 +123,7 @@
* @param {*} value - value to test
* @returns {boolean} boolean indicating if a value is a `Complex128Array`
*/
function isComplex128Array( value ) { // TODO: move to array/base/assert/is-complex128-array

Check warning on line 126 in lib/node_modules/@stdlib/array/complex64/lib/main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

Unexpected 'todo' comment: 'TODO: move to...'
return (
typeof value === 'object' &&
value !== null &&
Expand Down Expand Up @@ -282,7 +282,7 @@
}
buf = buf[ ITERATOR_SYMBOL ]();
if ( !isFunction( buf.next ) ) {
throw new TypeError( format( 'invalid argument. Must provide a length, ArrayBuffer, typed array, array-like object, or an iterable. Value: `%s`.', buf ) ); // FIXME: `buf` is what is returned from above, NOT the original value

Check warning on line 285 in lib/node_modules/@stdlib/array/complex64/lib/main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

Unexpected 'fixme' comment: 'FIXME: `buf` is what is returned from...'
}
buf = fromIterator( buf );
if ( buf instanceof Error ) {
Expand Down Expand Up @@ -747,7 +747,7 @@
if ( !isComplexArray( this ) ) {
throw new TypeError( 'invalid invocation. `this` is not a complex number array.' );
}
// FIXME: prefer a functional `copyWithin` implementation which addresses lack of universal browser support (e.g., IE11 and Safari) or ensure that typed arrays are polyfilled

Check warning on line 750 in lib/node_modules/@stdlib/array/complex64/lib/main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

Unexpected 'fixme' comment: 'FIXME: prefer a functional `copyWithin`...'
if ( arguments.length === 2 ) {
this._buffer.copyWithin( target*2, start*2 );
} else {
Expand Down Expand Up @@ -1886,7 +1886,7 @@
// We need to copy source values...
tmp = new Float32Array( N );
for ( i = 0; i < N; i++ ) {
tmp[ i ] = sbuf[ i ]; // TODO: handle accessor arrays

Check warning on line 1889 in lib/node_modules/@stdlib/array/complex64/lib/main.js

View workflow job for this annotation

GitHub Actions / Lint Changed Files

Unexpected 'todo' comment: 'TODO: handle accessor arrays'
}
sbuf = tmp;
}
Expand Down Expand Up @@ -2123,6 +2123,70 @@
return out.join( ',' );
});

/**
* Returns new typed array with the element at index replaced with value.
kgryte marked this conversation as resolved.
Show resolved Hide resolved
*
* @name with
* @memberof Complex64Array.prototype
* @type {Function}
* @param {integer} index - element index
* @param {Complex64} value - value to replace
kgryte marked this conversation as resolved.
Show resolved Hide resolved
* @throws {TypeError} `this` must be a complex number array
* @throws {TypeError} first argument must be an integer
* @throws {RangeError} index argument is out-of-bounds
* @throws {TypeError} second argument must be a complex number
* @returns {Complex64Array} new typed array
*
* @example
* var realf = require( '@stdlib/complex/realf' );
* var imagf = require( '@stdlib/complex/imagf' );
* var Complex64 = require( '@stdlib/complex/float32' );
*
* var arr = new Complex64Array( 3 );
*
* arr.set( [ 1.0, 1.0 ], 0 );
* arr.set( [ 2.0, 2.0 ], 1 );
* arr.set( [ 3.0, 3.0 ], 2 );
*
* var out = arr.with( 0, new Complex64( 4.0, 4.0 ) );
* // returns <Complex64Array>
*
* var z = out.get( 0 );
* // returns <Complex64>
*
* var re = realf( z );
* // returns 4.0
*
* var im = imagf( z );
* // returns 4.0
*/
setReadOnly( Complex64Array.prototype, 'with', function copyWith( index, value ) {
var outbuf;
kgryte marked this conversation as resolved.
Show resolved Hide resolved
var out;
var len;
if ( !isComplexArray( this ) ) {
throw new TypeError( 'invalid invocation. `this` is not a complex number array.' );
}
if ( !isInteger( index ) ) {
throw new TypeError( format( 'invalid argument. First argument must be an integer. Value: `%s`.', index ) );
}
len = this._length;
if ( index < 0 ) {
index += len;
}
if ( index < 0 || index >= len ) {
throw new RangeError( format( 'invalid argument. Index argument is out-of-bounds. Value: `%s`.', index ) );
}
if ( !isComplexLike( value ) ) {
throw new TypeError( format( 'invalid argument. Second argument must be a complex number. Value: `%s`.', value ) );
}
out = new this.constructor( this._buffer );
outbuf = out._buffer; // eslint-disable-line no-underscore-dangle
outbuf[ 2*index ] = realf( value );
outbuf[ (2*index)+1 ] = imagf( value );
kgryte marked this conversation as resolved.
Show resolved Hide resolved
return out;
});


// EXPORTS //

Expand Down
Loading
Loading