@ohos-ports/stdlib-simulate 0.4.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +177 -0
- package/NOTICE +1 -0
- package/README.md +188 -0
- package/SECURITY.md +5 -0
- package/docs/types/index.d.ts +43 -0
- package/iter/README.md +142 -0
- package/iter/awgn/README.md +240 -0
- package/iter/awgn/docs/repl.txt +85 -0
- package/iter/awgn/docs/types/index.d.ts +155 -0
- package/iter/awgn/docs/types/test.ts +150 -0
- package/iter/awgn/lib/defaults.js +38 -0
- package/iter/awgn/lib/index.js +55 -0
- package/iter/awgn/lib/main.js +278 -0
- package/iter/awgn/package.json +68 -0
- package/iter/awln/README.md +238 -0
- package/iter/awln/docs/repl.txt +85 -0
- package/iter/awln/docs/types/index.d.ts +155 -0
- package/iter/awln/docs/types/test.ts +150 -0
- package/iter/awln/lib/defaults.js +38 -0
- package/iter/awln/lib/index.js +55 -0
- package/iter/awln/lib/main.js +299 -0
- package/iter/awln/package.json +72 -0
- package/iter/awun/README.md +238 -0
- package/iter/awun/docs/repl.txt +85 -0
- package/iter/awun/docs/types/index.d.ts +155 -0
- package/iter/awun/docs/types/test.ts +150 -0
- package/iter/awun/lib/defaults.js +38 -0
- package/iter/awun/lib/index.js +55 -0
- package/iter/awun/lib/main.js +305 -0
- package/iter/awun/package.json +68 -0
- package/iter/bartlett-hann-pulse/README.md +331 -0
- package/iter/bartlett-hann-pulse/docs/img/equation_bartlett_hann_pulse_waveform.svg +191 -0
- package/iter/bartlett-hann-pulse/docs/repl.txt +54 -0
- package/iter/bartlett-hann-pulse/docs/types/index.d.ts +105 -0
- package/iter/bartlett-hann-pulse/docs/types/test.ts +89 -0
- package/iter/bartlett-hann-pulse/lib/index.js +54 -0
- package/iter/bartlett-hann-pulse/lib/main.js +192 -0
- package/iter/bartlett-hann-pulse/lib/validate.js +97 -0
- package/iter/bartlett-hann-pulse/package.json +76 -0
- package/iter/bartlett-pulse/README.md +328 -0
- package/iter/bartlett-pulse/docs/img/equation_bartlett_pulse_waveform.svg +128 -0
- package/iter/bartlett-pulse/docs/repl.txt +54 -0
- package/iter/bartlett-pulse/docs/types/index.d.ts +105 -0
- package/iter/bartlett-pulse/docs/types/test.ts +89 -0
- package/iter/bartlett-pulse/lib/index.js +54 -0
- package/iter/bartlett-pulse/lib/main.js +169 -0
- package/iter/bartlett-pulse/lib/validate.js +97 -0
- package/iter/bartlett-pulse/package.json +72 -0
- package/iter/cosine-wave/README.md +292 -0
- package/iter/cosine-wave/docs/img/equation_cosine_waveform.svg +55 -0
- package/iter/cosine-wave/docs/repl.txt +51 -0
- package/iter/cosine-wave/docs/types/index.d.ts +96 -0
- package/iter/cosine-wave/docs/types/test.ts +78 -0
- package/iter/cosine-wave/lib/index.js +54 -0
- package/iter/cosine-wave/lib/main.js +156 -0
- package/iter/cosine-wave/lib/validate.js +90 -0
- package/iter/cosine-wave/package.json +70 -0
- package/iter/dirac-comb/README.md +278 -0
- package/iter/dirac-comb/docs/img/equation_dirac_comb.svg +44 -0
- package/iter/dirac-comb/docs/repl.txt +48 -0
- package/iter/dirac-comb/docs/types/index.d.ts +89 -0
- package/iter/dirac-comb/docs/types/test.ts +78 -0
- package/iter/dirac-comb/lib/index.js +54 -0
- package/iter/dirac-comb/lib/main.js +152 -0
- package/iter/dirac-comb/lib/validate.js +82 -0
- package/iter/dirac-comb/package.json +72 -0
- package/iter/docs/types/index.d.ts +678 -0
- package/iter/docs/types/test.ts +29 -0
- package/iter/flat-top-pulse/README.md +330 -0
- package/iter/flat-top-pulse/docs/img/equation_flat_top_pulse_waveform.svg +177 -0
- package/iter/flat-top-pulse/docs/repl.txt +54 -0
- package/iter/flat-top-pulse/docs/types/index.d.ts +105 -0
- package/iter/flat-top-pulse/docs/types/test.ts +89 -0
- package/iter/flat-top-pulse/lib/index.js +54 -0
- package/iter/flat-top-pulse/lib/main.js +193 -0
- package/iter/flat-top-pulse/lib/validate.js +97 -0
- package/iter/flat-top-pulse/package.json +71 -0
- package/iter/hann-pulse/README.md +328 -0
- package/iter/hann-pulse/docs/img/equation_hann_pulse_waveform.svg +129 -0
- package/iter/hann-pulse/docs/repl.txt +54 -0
- package/iter/hann-pulse/docs/types/index.d.ts +105 -0
- package/iter/hann-pulse/docs/types/test.ts +89 -0
- package/iter/hann-pulse/lib/index.js +54 -0
- package/iter/hann-pulse/lib/main.js +171 -0
- package/iter/hann-pulse/lib/validate.js +97 -0
- package/iter/hann-pulse/package.json +72 -0
- package/iter/lanczos-pulse/README.md +325 -0
- package/iter/lanczos-pulse/docs/img/equation_lanczos_pulse_waveform.svg +122 -0
- package/iter/lanczos-pulse/docs/repl.txt +54 -0
- package/iter/lanczos-pulse/docs/types/index.d.ts +105 -0
- package/iter/lanczos-pulse/docs/types/test.ts +89 -0
- package/iter/lanczos-pulse/lib/index.js +54 -0
- package/iter/lanczos-pulse/lib/main.js +169 -0
- package/iter/lanczos-pulse/lib/validate.js +97 -0
- package/iter/lanczos-pulse/package.json +70 -0
- package/iter/lib/index.js +186 -0
- package/iter/package.json +63 -0
- package/iter/periodic-sinc/README.md +301 -0
- package/iter/periodic-sinc/docs/img/equation_periodic_sinc.svg +146 -0
- package/iter/periodic-sinc/docs/img/equation_periodic_sinc_in_terms_of_period.svg +164 -0
- package/iter/periodic-sinc/docs/img/equation_periodic_sinc_in_terms_of_sinc_function.svg +65 -0
- package/iter/periodic-sinc/docs/img/equation_periodic_sinc_substitution_even.svg +34 -0
- package/iter/periodic-sinc/docs/img/equation_periodic_sinc_substitution_odd.svg +34 -0
- package/iter/periodic-sinc/docs/repl.txt +54 -0
- package/iter/periodic-sinc/docs/types/index.d.ts +98 -0
- package/iter/periodic-sinc/docs/types/test.ts +102 -0
- package/iter/periodic-sinc/lib/index.js +50 -0
- package/iter/periodic-sinc/lib/main.js +241 -0
- package/iter/periodic-sinc/lib/validate.js +90 -0
- package/iter/periodic-sinc/package.json +70 -0
- package/iter/pulse/README.md +322 -0
- package/iter/pulse/docs/img/equation_pulse_waveform.svg +115 -0
- package/iter/pulse/docs/repl.txt +58 -0
- package/iter/pulse/docs/types/index.d.ts +109 -0
- package/iter/pulse/docs/types/test.ts +100 -0
- package/iter/pulse/lib/index.js +54 -0
- package/iter/pulse/lib/main.js +165 -0
- package/iter/pulse/lib/validate.js +105 -0
- package/iter/pulse/package.json +69 -0
- package/iter/sawtooth-wave/README.md +289 -0
- package/iter/sawtooth-wave/docs/img/equation_sawtooth_waveform.svg +73 -0
- package/iter/sawtooth-wave/docs/repl.txt +51 -0
- package/iter/sawtooth-wave/docs/types/index.d.ts +96 -0
- package/iter/sawtooth-wave/docs/types/test.ts +78 -0
- package/iter/sawtooth-wave/lib/index.js +54 -0
- package/iter/sawtooth-wave/lib/main.js +161 -0
- package/iter/sawtooth-wave/lib/validate.js +90 -0
- package/iter/sawtooth-wave/package.json +67 -0
- package/iter/sine-wave/README.md +292 -0
- package/iter/sine-wave/docs/img/equation_sine_waveform.svg +55 -0
- package/iter/sine-wave/docs/repl.txt +51 -0
- package/iter/sine-wave/docs/types/index.d.ts +96 -0
- package/iter/sine-wave/docs/types/test.ts +78 -0
- package/iter/sine-wave/lib/index.js +54 -0
- package/iter/sine-wave/lib/main.js +156 -0
- package/iter/sine-wave/lib/validate.js +90 -0
- package/iter/sine-wave/package.json +70 -0
- package/iter/square-wave/README.md +291 -0
- package/iter/square-wave/docs/img/equation_square_waveform.svg +115 -0
- package/iter/square-wave/docs/repl.txt +55 -0
- package/iter/square-wave/docs/types/index.d.ts +105 -0
- package/iter/square-wave/docs/types/test.ts +89 -0
- package/iter/square-wave/lib/index.js +54 -0
- package/iter/square-wave/lib/main.js +156 -0
- package/iter/square-wave/lib/validate.js +99 -0
- package/iter/square-wave/package.json +67 -0
- package/iter/triangle-wave/README.md +289 -0
- package/iter/triangle-wave/docs/img/equation_triangle_waveform.svg +75 -0
- package/iter/triangle-wave/docs/repl.txt +51 -0
- package/iter/triangle-wave/docs/types/index.d.ts +96 -0
- package/iter/triangle-wave/docs/types/test.ts +78 -0
- package/iter/triangle-wave/lib/index.js +54 -0
- package/iter/triangle-wave/lib/main.js +160 -0
- package/iter/triangle-wave/lib/validate.js +90 -0
- package/iter/triangle-wave/package.json +66 -0
- package/lib/index.js +51 -0
- package/package.json +72 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @license Apache-2.0
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2019 The Stdlib Authors.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
// TypeScript Version: 4.1
|
|
20
|
+
|
|
21
|
+
/// <reference types="@stdlib/types"/>
|
|
22
|
+
|
|
23
|
+
import { Iterator as Iter, IterableIterator } from '@stdlib/types/iter';
|
|
24
|
+
import * as random from '@stdlib/types/random';
|
|
25
|
+
|
|
26
|
+
// Define a union type representing both iterable and non-iterable iterators:
|
|
27
|
+
type Iterator = Iter | IterableIterator;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Interface defining function options.
|
|
31
|
+
*/
|
|
32
|
+
interface Options {
|
|
33
|
+
/**
|
|
34
|
+
* Pseudorandom number generator which generates uniformly distributed pseudorandom numbers on the interval `[0,1)`.
|
|
35
|
+
*
|
|
36
|
+
* ## Notes
|
|
37
|
+
*
|
|
38
|
+
* - If provided, the `state` and `seed` options are ignored. In order to seed the returned iterator, one must seed the provided `prng` (assuming the provided `prng` is seedable).
|
|
39
|
+
*/
|
|
40
|
+
prng?: random.PRNG;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Pseudorandom number generator state.
|
|
44
|
+
*
|
|
45
|
+
* ## Notes
|
|
46
|
+
*
|
|
47
|
+
* - If provided, the `seed` option is ignored.
|
|
48
|
+
*/
|
|
49
|
+
state?: random.PRNGStateMT19937;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Pseudorandom number generator seed.
|
|
53
|
+
*/
|
|
54
|
+
seed?: random.PRNGSeedMT19937;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Specifies whether to copy a provided pseudorandom number generator state.
|
|
58
|
+
*
|
|
59
|
+
* ## Notes
|
|
60
|
+
*
|
|
61
|
+
* - Setting this option to `false` allows sharing state between two or more pseudorandom number generators. Setting this option to `true` ensures that a returned iterator has exclusive control over its internal state.
|
|
62
|
+
*/
|
|
63
|
+
copy?: boolean;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Interface defining a returned iterator.
|
|
68
|
+
*/
|
|
69
|
+
interface ExtendedIter extends Iter {
|
|
70
|
+
/**
|
|
71
|
+
* Underlying PRNG.
|
|
72
|
+
*/
|
|
73
|
+
readonly PRNG: random.PRNG;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* PRNG seed.
|
|
77
|
+
*/
|
|
78
|
+
readonly seed: random.PRNGSeedMT19937 | null;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* PRNG seed length.
|
|
82
|
+
*/
|
|
83
|
+
readonly seedLength: number | null;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* PRNG state.
|
|
87
|
+
*/
|
|
88
|
+
state: random.PRNGStateMT19937 | null;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* PRNG state length.
|
|
92
|
+
*/
|
|
93
|
+
readonly stateLength: number | null;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* PRNG state size (in bytes).
|
|
97
|
+
*/
|
|
98
|
+
readonly byteLength: number | null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Interface defining a returned iterable iterator.
|
|
103
|
+
*/
|
|
104
|
+
interface ExtendedIterableIterator extends ExtendedIter {
|
|
105
|
+
/**
|
|
106
|
+
* Returns a new iterable iterator.
|
|
107
|
+
*
|
|
108
|
+
* @returns iterable iterator
|
|
109
|
+
*/
|
|
110
|
+
[Symbol.iterator](): IterableIterator;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Define a union type representing both iterable and non-iterable returned iterators:
|
|
114
|
+
type ExtendedIterator = ExtendedIter | ExtendedIterableIterator;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Returns an iterator which introduces additive white uniform noise with standard deviation `sigma`.
|
|
118
|
+
*
|
|
119
|
+
* @param iterator - input iterator
|
|
120
|
+
* @param sigma - standard deviation of the noise
|
|
121
|
+
* @param options - function options
|
|
122
|
+
* @param options.prng - pseudorandom number generator for generating uniformly distributed pseudorandom numbers on the interval `[0,1)`
|
|
123
|
+
* @param options.state - pseudorandom number generator state
|
|
124
|
+
* @param options.seed - pseudorandom number generator seed
|
|
125
|
+
* @param options.copy - boolean indicating whether to copy a provided pseudorandom number generator state (default: true)
|
|
126
|
+
* @throws `sigma` must be a positive number
|
|
127
|
+
* @throws must provide a valid state
|
|
128
|
+
* @returns iterator
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* var iterSineWave = require( '@stdlib/simulate/iter/sine-wave' );
|
|
132
|
+
*
|
|
133
|
+
* var sine = iterSineWave({
|
|
134
|
+
* 'iter': 100
|
|
135
|
+
* });
|
|
136
|
+
*
|
|
137
|
+
* var it = iterawun( sine, 0.5 );
|
|
138
|
+
*
|
|
139
|
+
* var v = it.next().value;
|
|
140
|
+
* // returns <number>
|
|
141
|
+
*
|
|
142
|
+
* v = it.next().value;
|
|
143
|
+
* // returns <number>
|
|
144
|
+
*
|
|
145
|
+
* v = it.next().value;
|
|
146
|
+
* // returns <number>
|
|
147
|
+
*
|
|
148
|
+
* // ...
|
|
149
|
+
*/
|
|
150
|
+
declare function iterawun( iterator: Iterator, sigma: number, options?: Options ): ExtendedIterator;
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
// EXPORTS //
|
|
154
|
+
|
|
155
|
+
export = iterawun;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @license Apache-2.0
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2019 The Stdlib Authors.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import iterawun = require( './index' );
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Returns an iterator protocol-compliant object.
|
|
23
|
+
*
|
|
24
|
+
* @returns iterator protocol-compliant object
|
|
25
|
+
*/
|
|
26
|
+
function iterator() {
|
|
27
|
+
return {
|
|
28
|
+
'next': next
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Implements the iterator protocol `next` method.
|
|
33
|
+
*
|
|
34
|
+
* @returns iterator protocol-compliant object
|
|
35
|
+
*/
|
|
36
|
+
function next() {
|
|
37
|
+
return {
|
|
38
|
+
'value': true,
|
|
39
|
+
'done': false
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
// TESTS //
|
|
46
|
+
|
|
47
|
+
// The function returns an iterator...
|
|
48
|
+
{
|
|
49
|
+
iterawun( iterator(), 0.2 ); // $ExpectType ExtendedIterator
|
|
50
|
+
iterawun( iterator(), 0.2, {} ); // $ExpectType ExtendedIterator
|
|
51
|
+
iterawun( iterator(), 0.2, { 'seed': 12345 } ); // $ExpectType ExtendedIterator
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The compiler throws an error if the function is provided a first argument which is not an iterator protocol-compliant object...
|
|
55
|
+
{
|
|
56
|
+
iterawun( '5', 1.0 ); // $ExpectError
|
|
57
|
+
iterawun( 5, 1.0 ); // $ExpectError
|
|
58
|
+
iterawun( true, 1.0 ); // $ExpectError
|
|
59
|
+
iterawun( false, 1.0 ); // $ExpectError
|
|
60
|
+
iterawun( null, 1.0 ); // $ExpectError
|
|
61
|
+
iterawun( undefined, 1.0 ); // $ExpectError
|
|
62
|
+
iterawun( [], 1.0 ); // $ExpectError
|
|
63
|
+
iterawun( {}, 1.0 ); // $ExpectError
|
|
64
|
+
iterawun( ( x: number ): number => x, 1.0 ); // $ExpectError
|
|
65
|
+
|
|
66
|
+
iterawun( '5', 1.0, {} ); // $ExpectError
|
|
67
|
+
iterawun( 5, 1.0, {} ); // $ExpectError
|
|
68
|
+
iterawun( true, 1.0, {} ); // $ExpectError
|
|
69
|
+
iterawun( false, 1.0, {} ); // $ExpectError
|
|
70
|
+
iterawun( null, 1.0, {} ); // $ExpectError
|
|
71
|
+
iterawun( undefined, 1.0, {} ); // $ExpectError
|
|
72
|
+
iterawun( [], 1.0, {} ); // $ExpectError
|
|
73
|
+
iterawun( {}, 1.0, {} ); // $ExpectError
|
|
74
|
+
iterawun( ( x: number ): number => x, 1.0, {} ); // $ExpectError
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The compiler throws an error if the function is provided a second argument which is not a number...
|
|
78
|
+
{
|
|
79
|
+
iterawun( iterator(), '5' ); // $ExpectError
|
|
80
|
+
iterawun( iterator(), true ); // $ExpectError
|
|
81
|
+
iterawun( iterator(), false ); // $ExpectError
|
|
82
|
+
iterawun( iterator(), null ); // $ExpectError
|
|
83
|
+
iterawun( iterator(), undefined ); // $ExpectError
|
|
84
|
+
iterawun( iterator(), [] ); // $ExpectError
|
|
85
|
+
iterawun( iterator(), {} ); // $ExpectError
|
|
86
|
+
iterawun( iterator(), ( x: number ): number => x ); // $ExpectError
|
|
87
|
+
|
|
88
|
+
iterawun( iterator(), '5', {} ); // $ExpectError
|
|
89
|
+
iterawun( iterator(), true, {} ); // $ExpectError
|
|
90
|
+
iterawun( iterator(), false, {} ); // $ExpectError
|
|
91
|
+
iterawun( iterator(), null, {} ); // $ExpectError
|
|
92
|
+
iterawun( iterator(), undefined, {} ); // $ExpectError
|
|
93
|
+
iterawun( iterator(), [], {} ); // $ExpectError
|
|
94
|
+
iterawun( iterator(), {}, {} ); // $ExpectError
|
|
95
|
+
iterawun( iterator(), ( x: number ): number => x, {} ); // $ExpectError
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The compiler throws an error if the function is provided a third argument which is not an object...
|
|
99
|
+
{
|
|
100
|
+
iterawun( iterator(), 1.0, null ); // $ExpectError
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The compiler throws an error if the function is provided an invalid `seed` option...
|
|
104
|
+
{
|
|
105
|
+
iterawun( iterator(), 1.0, { 'seed': '5' } ); // $ExpectError
|
|
106
|
+
iterawun( iterator(), 1.0, { 'seed': true } ); // $ExpectError
|
|
107
|
+
iterawun( iterator(), 1.0, { 'seed': false } ); // $ExpectError
|
|
108
|
+
iterawun( iterator(), 1.0, { 'seed': null } ); // $ExpectError
|
|
109
|
+
iterawun( iterator(), 1.0, { 'seed': {} } ); // $ExpectError
|
|
110
|
+
iterawun( iterator(), 1.0, { 'seed': ( x: number ): number => x } ); // $ExpectError
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// The compiler throws an error if the function is provided an invalid `prng` option...
|
|
114
|
+
{
|
|
115
|
+
iterawun( iterator(), 1.0, { 'prng': '5' } ); // $ExpectError
|
|
116
|
+
iterawun( iterator(), 1.0, { 'prng': 5 } ); // $ExpectError
|
|
117
|
+
iterawun( iterator(), 1.0, { 'prng': true } ); // $ExpectError
|
|
118
|
+
iterawun( iterator(), 1.0, { 'prng': false } ); // $ExpectError
|
|
119
|
+
iterawun( iterator(), 1.0, { 'prng': null } ); // $ExpectError
|
|
120
|
+
iterawun( iterator(), 1.0, { 'prng': [] } ); // $ExpectError
|
|
121
|
+
iterawun( iterator(), 1.0, { 'prng': {} } ); // $ExpectError
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// The compiler throws an error if the function is provided an invalid `state` option...
|
|
125
|
+
{
|
|
126
|
+
iterawun( iterator(), 1.0, { 'state': '5' } ); // $ExpectError
|
|
127
|
+
iterawun( iterator(), 1.0, { 'state': 5 } ); // $ExpectError
|
|
128
|
+
iterawun( iterator(), 1.0, { 'state': true } ); // $ExpectError
|
|
129
|
+
iterawun( iterator(), 1.0, { 'state': false } ); // $ExpectError
|
|
130
|
+
iterawun( iterator(), 1.0, { 'state': null } ); // $ExpectError
|
|
131
|
+
iterawun( iterator(), 1.0, { 'state': [] } ); // $ExpectError
|
|
132
|
+
iterawun( iterator(), 1.0, { 'state': {} } ); // $ExpectError
|
|
133
|
+
iterawun( iterator(), 1.0, { 'state': ( x: number ): number => x } ); // $ExpectError
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// The compiler throws an error if the function is provided an invalid `copy` option...
|
|
137
|
+
{
|
|
138
|
+
iterawun( iterator(), 1.0, { 'copy': '5' } ); // $ExpectError
|
|
139
|
+
iterawun( iterator(), 1.0, { 'copy': 5 } ); // $ExpectError
|
|
140
|
+
iterawun( iterator(), 1.0, { 'copy': null } ); // $ExpectError
|
|
141
|
+
iterawun( iterator(), 1.0, { 'copy': [] } ); // $ExpectError
|
|
142
|
+
iterawun( iterator(), 1.0, { 'copy': {} } ); // $ExpectError
|
|
143
|
+
iterawun( iterator(), 1.0, { 'copy': ( x: number ): number => x } ); // $ExpectError
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// The compiler throws an error if the function is provided insufficient arguments...
|
|
147
|
+
{
|
|
148
|
+
iterawun(); // $ExpectError
|
|
149
|
+
iterawun( iterator() ); // $ExpectError
|
|
150
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Apache-2.0
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2023 The Stdlib Authors.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
// MAIN //
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Returns default options.
|
|
25
|
+
*
|
|
26
|
+
* @private
|
|
27
|
+
* @returns {Object} default options
|
|
28
|
+
*/
|
|
29
|
+
function defaults() {
|
|
30
|
+
return {
|
|
31
|
+
'copy': true
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
// EXPORTS //
|
|
37
|
+
|
|
38
|
+
module.exports = defaults;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Apache-2.0
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2019 The Stdlib Authors.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Create an iterator which introduces additive white uniform noise (AWUN).
|
|
23
|
+
*
|
|
24
|
+
* @module @stdlib/simulate/iter/awun
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* var iterSineWave = require( '@stdlib/simulate/iter/sine-wave' );
|
|
28
|
+
* var iterawun = require( '@stdlib/simulate/iter/awun' );
|
|
29
|
+
*
|
|
30
|
+
* var sine = iterSineWave({
|
|
31
|
+
* 'iter': 100
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* var it = iterawun( sine, 0.5 );
|
|
35
|
+
*
|
|
36
|
+
* var v = it.next().value;
|
|
37
|
+
* // returns <number>
|
|
38
|
+
*
|
|
39
|
+
* v = it.next().value;
|
|
40
|
+
* // returns <number>
|
|
41
|
+
*
|
|
42
|
+
* v = it.next().value;
|
|
43
|
+
* // returns <number>
|
|
44
|
+
*
|
|
45
|
+
* // ...
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
// MODULES //
|
|
49
|
+
|
|
50
|
+
var main = require( './main.js' );
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
// EXPORTS //
|
|
54
|
+
|
|
55
|
+
module.exports = main;
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Apache-2.0
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2019 The Stdlib Authors.
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
// MODULES //
|
|
22
|
+
|
|
23
|
+
var setReadOnly = require( '@stdlib/utils/define-nonenumerable-read-only-property' );
|
|
24
|
+
var setReadOnlyAccessor = require( '@stdlib/utils/define-nonenumerable-read-only-accessor' );
|
|
25
|
+
var setReadWriteAccessor = require( '@stdlib/utils/define-nonenumerable-read-write-accessor' );
|
|
26
|
+
var isIteratorLike = require( '@stdlib/assert/is-iterator-like' );
|
|
27
|
+
var isPositiveNumber = require( '@stdlib/assert/is-positive-number' ).isPrimitive;
|
|
28
|
+
var isPlainObject = require( '@stdlib/assert/is-plain-object' );
|
|
29
|
+
var isFunction = require( '@stdlib/assert/is-function' );
|
|
30
|
+
var isBoolean = require( '@stdlib/assert/is-boolean' ).isPrimitive;
|
|
31
|
+
var isUint32Array = require( '@stdlib/assert/is-uint32array' );
|
|
32
|
+
var hasOwnProp = require( '@stdlib/assert/has-own-property' );
|
|
33
|
+
var noop = require( '@stdlib/utils/noop' );
|
|
34
|
+
var constantFunction = require( '@stdlib/utils/constant-function' );
|
|
35
|
+
var format = require( '@stdlib/string/format' );
|
|
36
|
+
var iteratorSymbol = require( '@stdlib/symbol/iterator' );
|
|
37
|
+
var randu = require( '@stdlib/random/base/uniform' ).factory;
|
|
38
|
+
var SQRT_THREE = require( '@stdlib/constants/float64/sqrt-three' );
|
|
39
|
+
var defaults = require( './defaults.js' );
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
// MAIN //
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Returns an iterator which introduces additive white uniform noise with standard deviation `sigma`.
|
|
46
|
+
*
|
|
47
|
+
* ## Method
|
|
48
|
+
*
|
|
49
|
+
* - The variance of a uniform distribution is given by
|
|
50
|
+
*
|
|
51
|
+
* ```tex
|
|
52
|
+
* \operatorname{Var} = \frac{(b-a)^2}{12}
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* where \\( a \\) is the minimum support and \\( b \\) is the maximum support.
|
|
56
|
+
*
|
|
57
|
+
* - Accordingly, to generate uniform noise having zero mean and a desired standard deviation, we let \\( a = -b \\) and solve for \\( b \\).
|
|
58
|
+
*
|
|
59
|
+
* ```tex
|
|
60
|
+
* \begin{align*}
|
|
61
|
+
* \sigma &= \frac{b-a}{\sqrt{12}} \\
|
|
62
|
+
* \sigma \sqrt{12} &= b - a \\
|
|
63
|
+
* 2 \sigma \sqrt{3} &= b - (-b) \\
|
|
64
|
+
* 2 \sigma \sqrt{3} &= 2b \\
|
|
65
|
+
* b &= \sigma \sqrt{3}
|
|
66
|
+
* \end{align*}
|
|
67
|
+
* ```
|
|
68
|
+
*
|
|
69
|
+
* where \\( \sigma \\) is the standard deviation.
|
|
70
|
+
*
|
|
71
|
+
* - Thus, to generate uniform noise having zero mean and a desired standard deviation, we sample from \\( \operatorname{unif}(-sigma\sqrt{3}, sigma\sqrt{3}) \\).
|
|
72
|
+
*
|
|
73
|
+
* @param {Iterator} iterator - input iterator
|
|
74
|
+
* @param {PositiveNumber} sigma - standard deviation of the noise
|
|
75
|
+
* @param {Options} [options] - function options
|
|
76
|
+
* @param {PRNG} [options.prng] - pseudorandom number generator which generates uniformly distributed pseudorandom numbers on the interval `[0,1)`
|
|
77
|
+
* @param {PRNGSeedMT19937} [options.seed] - pseudorandom number generator seed
|
|
78
|
+
* @param {PRNGStateMT19937} [options.state] - pseudorandom number generator state
|
|
79
|
+
* @param {boolean} [options.copy=true] - boolean indicating whether to copy a provided pseudorandom number generator state
|
|
80
|
+
* @throws {TypeError} first argument must be an iterator
|
|
81
|
+
* @throws {TypeError} second argument must be a positive number
|
|
82
|
+
* @throws {TypeError} third argument must be an object
|
|
83
|
+
* @throws {TypeError} must provide valid options
|
|
84
|
+
* @throws {Error} must provide a valid state
|
|
85
|
+
* @returns {Iterator} iterator
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* var iterSineWave = require( '@stdlib/simulate/iter/sine-wave' );
|
|
89
|
+
*
|
|
90
|
+
* var sine = iterSineWave({
|
|
91
|
+
* 'iter': 100
|
|
92
|
+
* });
|
|
93
|
+
*
|
|
94
|
+
* var it = iterawun( sine, 0.5 );
|
|
95
|
+
*
|
|
96
|
+
* var v = it.next().value;
|
|
97
|
+
* // returns <number>
|
|
98
|
+
*
|
|
99
|
+
* v = it.next().value;
|
|
100
|
+
* // returns <number>
|
|
101
|
+
*
|
|
102
|
+
* v = it.next().value;
|
|
103
|
+
* // returns <number>
|
|
104
|
+
*
|
|
105
|
+
* // ...
|
|
106
|
+
*/
|
|
107
|
+
function iterawun( iterator, sigma, options ) {
|
|
108
|
+
var runif;
|
|
109
|
+
var opts;
|
|
110
|
+
var iter;
|
|
111
|
+
var FLG;
|
|
112
|
+
var a;
|
|
113
|
+
if ( !isIteratorLike( iterator ) ) {
|
|
114
|
+
throw new TypeError( format( 'invalid argument. First argument must be an iterator. Value: `%s`.', iterator ) );
|
|
115
|
+
}
|
|
116
|
+
if ( !isPositiveNumber( sigma ) ) {
|
|
117
|
+
throw new TypeError( format( 'invalid argument. Second argument must be a positive number. Value: `%s`.', sigma ) );
|
|
118
|
+
}
|
|
119
|
+
opts = defaults();
|
|
120
|
+
if ( arguments.length > 2 ) {
|
|
121
|
+
if ( !isPlainObject( options ) ) {
|
|
122
|
+
throw new TypeError( format( 'invalid argument. Third argument must be an object. Value: `%s`.', options ) );
|
|
123
|
+
}
|
|
124
|
+
if ( hasOwnProp( options, 'copy' ) ) {
|
|
125
|
+
opts.copy = options.copy;
|
|
126
|
+
if ( !isBoolean( options.copy ) ) {
|
|
127
|
+
throw new TypeError( format( 'invalid option. `%s` option must be a boolean. Option: `%s`.', 'copy', options.copy ) );
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if ( hasOwnProp( options, 'prng' ) ) {
|
|
131
|
+
if ( !isFunction( options.prng ) ) {
|
|
132
|
+
throw new TypeError( format( 'invalid option. `%s` option must be a pseudorandom number generator function. Option: `%s`.', 'prng', options.prng ) );
|
|
133
|
+
}
|
|
134
|
+
opts.prng = options.prng;
|
|
135
|
+
}
|
|
136
|
+
// If provided a PRNG, ignore the `state` option, as we don't support getting or setting PRNG state.
|
|
137
|
+
else if ( hasOwnProp( options, 'state' ) ) {
|
|
138
|
+
opts.state = options.state;
|
|
139
|
+
if ( !isUint32Array( options.state ) ) {
|
|
140
|
+
throw new TypeError( format( 'invalid option. `%s` option must be a Uint32Array. Option: `%s`.', 'state', options.state ) );
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// If provided a PRNG, ignore the `seed` option, as a `seed`, by itself, is insufficient to guarantee reproducibility. If provided a state, ignore the `seed` option, as a PRNG state should contain seed information.
|
|
144
|
+
else if ( hasOwnProp( options, 'seed' ) ) {
|
|
145
|
+
opts.seed = options.seed;
|
|
146
|
+
if ( options.seed === void 0 ) {
|
|
147
|
+
throw new TypeError( format( 'invalid option. `%s` option must be either a positive integer less than or equal to the maximum unsigned 32-bit integer or an array-like object containing integer values less than or equal to the maximum unsigned 32-bit integer. Option: `%s`.', 'seed', options.seed ) );
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
a = sigma * SQRT_THREE;
|
|
152
|
+
runif = randu( -a, a, opts );
|
|
153
|
+
|
|
154
|
+
// Create an iterator protocol-compliant object:
|
|
155
|
+
iter = {};
|
|
156
|
+
setReadOnly( iter, 'next', next );
|
|
157
|
+
setReadOnly( iter, 'return', end );
|
|
158
|
+
|
|
159
|
+
// If an environment supports `Symbol.iterator` and the provided iterator is iterable, make the iterator iterable:
|
|
160
|
+
if ( iteratorSymbol && isFunction( iterator[ iteratorSymbol ] ) ) {
|
|
161
|
+
setReadOnly( iter, iteratorSymbol, factory );
|
|
162
|
+
}
|
|
163
|
+
// If we are provided an "external" PRNG, we don't support getting or setting PRNG state, as we'd need to check for compatible state value types, etc, entailing considerable complexity.
|
|
164
|
+
if ( options && options.prng ) {
|
|
165
|
+
setReadOnly( iter, 'seed', null );
|
|
166
|
+
setReadOnly( iter, 'seedLength', null );
|
|
167
|
+
setReadWriteAccessor( iter, 'state', constantFunction( null ), noop );
|
|
168
|
+
setReadOnly( iter, 'stateLength', null );
|
|
169
|
+
setReadOnly( iter, 'byteLength', null );
|
|
170
|
+
setReadOnly( iter, 'PRNG', options.prng );
|
|
171
|
+
} else {
|
|
172
|
+
setReadOnlyAccessor( iter, 'seed', getSeed );
|
|
173
|
+
setReadOnlyAccessor( iter, 'seedLength', getSeedLength );
|
|
174
|
+
setReadWriteAccessor( iter, 'state', getState, setState );
|
|
175
|
+
setReadOnlyAccessor( iter, 'stateLength', getStateLength );
|
|
176
|
+
setReadOnlyAccessor( iter, 'byteLength', getStateSize );
|
|
177
|
+
setReadOnly( iter, 'PRNG', runif.PRNG );
|
|
178
|
+
}
|
|
179
|
+
return iter;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Returns the PRNG seed.
|
|
183
|
+
*
|
|
184
|
+
* @private
|
|
185
|
+
* @returns {PRNGSeedMT19937} seed
|
|
186
|
+
*/
|
|
187
|
+
function getSeed() {
|
|
188
|
+
return runif.seed;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Returns the PRNG seed length.
|
|
193
|
+
*
|
|
194
|
+
* @private
|
|
195
|
+
* @returns {PositiveInteger} seed length
|
|
196
|
+
*/
|
|
197
|
+
function getSeedLength() {
|
|
198
|
+
return runif.seedLength;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Returns the PRNG state length.
|
|
203
|
+
*
|
|
204
|
+
* @private
|
|
205
|
+
* @returns {PositiveInteger} state length
|
|
206
|
+
*/
|
|
207
|
+
function getStateLength() {
|
|
208
|
+
return runif.stateLength;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Returns the PRNG state size (in bytes).
|
|
213
|
+
*
|
|
214
|
+
* @private
|
|
215
|
+
* @returns {PositiveInteger} state size (in bytes)
|
|
216
|
+
*/
|
|
217
|
+
function getStateSize() {
|
|
218
|
+
return runif.byteLength;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Returns the current PRNG state.
|
|
223
|
+
*
|
|
224
|
+
* @private
|
|
225
|
+
* @returns {PRNGStateMT19937} current state
|
|
226
|
+
*/
|
|
227
|
+
function getState() {
|
|
228
|
+
return runif.state;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Sets the PRNG state.
|
|
233
|
+
*
|
|
234
|
+
* @private
|
|
235
|
+
* @param {PRNGStateMT19937} s - generator state
|
|
236
|
+
* @throws {Error} must provide a valid state
|
|
237
|
+
*/
|
|
238
|
+
function setState( s ) {
|
|
239
|
+
runif.state = s;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Returns an iterator protocol-compliant object containing the next iterated value.
|
|
244
|
+
*
|
|
245
|
+
* @private
|
|
246
|
+
* @returns {Object} iterator protocol-compliant object
|
|
247
|
+
*/
|
|
248
|
+
function next() {
|
|
249
|
+
var v;
|
|
250
|
+
if ( FLG ) {
|
|
251
|
+
return {
|
|
252
|
+
'done': true
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
v = iterator.next();
|
|
256
|
+
if ( v.done ) {
|
|
257
|
+
FLG = true;
|
|
258
|
+
return v;
|
|
259
|
+
}
|
|
260
|
+
if ( typeof v.value === 'number' ) {
|
|
261
|
+
v = v.value + runif();
|
|
262
|
+
} else {
|
|
263
|
+
v = NaN;
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
'value': v,
|
|
267
|
+
'done': false
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Finishes an iterator.
|
|
273
|
+
*
|
|
274
|
+
* @private
|
|
275
|
+
* @param {*} [value] - value to return
|
|
276
|
+
* @returns {Object} iterator protocol-compliant object
|
|
277
|
+
*/
|
|
278
|
+
function end( value ) {
|
|
279
|
+
FLG = true;
|
|
280
|
+
if ( arguments.length ) {
|
|
281
|
+
return {
|
|
282
|
+
'value': value,
|
|
283
|
+
'done': true
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
'done': true
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Returns a new iterator.
|
|
293
|
+
*
|
|
294
|
+
* @private
|
|
295
|
+
* @returns {Iterator} iterator
|
|
296
|
+
*/
|
|
297
|
+
function factory() {
|
|
298
|
+
return iterawun( iterator[ iteratorSymbol ](), sigma, opts );
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
// EXPORTS //
|
|
304
|
+
|
|
305
|
+
module.exports = iterawun;
|