@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.
Files changed (157) hide show
  1. package/LICENSE +177 -0
  2. package/NOTICE +1 -0
  3. package/README.md +188 -0
  4. package/SECURITY.md +5 -0
  5. package/docs/types/index.d.ts +43 -0
  6. package/iter/README.md +142 -0
  7. package/iter/awgn/README.md +240 -0
  8. package/iter/awgn/docs/repl.txt +85 -0
  9. package/iter/awgn/docs/types/index.d.ts +155 -0
  10. package/iter/awgn/docs/types/test.ts +150 -0
  11. package/iter/awgn/lib/defaults.js +38 -0
  12. package/iter/awgn/lib/index.js +55 -0
  13. package/iter/awgn/lib/main.js +278 -0
  14. package/iter/awgn/package.json +68 -0
  15. package/iter/awln/README.md +238 -0
  16. package/iter/awln/docs/repl.txt +85 -0
  17. package/iter/awln/docs/types/index.d.ts +155 -0
  18. package/iter/awln/docs/types/test.ts +150 -0
  19. package/iter/awln/lib/defaults.js +38 -0
  20. package/iter/awln/lib/index.js +55 -0
  21. package/iter/awln/lib/main.js +299 -0
  22. package/iter/awln/package.json +72 -0
  23. package/iter/awun/README.md +238 -0
  24. package/iter/awun/docs/repl.txt +85 -0
  25. package/iter/awun/docs/types/index.d.ts +155 -0
  26. package/iter/awun/docs/types/test.ts +150 -0
  27. package/iter/awun/lib/defaults.js +38 -0
  28. package/iter/awun/lib/index.js +55 -0
  29. package/iter/awun/lib/main.js +305 -0
  30. package/iter/awun/package.json +68 -0
  31. package/iter/bartlett-hann-pulse/README.md +331 -0
  32. package/iter/bartlett-hann-pulse/docs/img/equation_bartlett_hann_pulse_waveform.svg +191 -0
  33. package/iter/bartlett-hann-pulse/docs/repl.txt +54 -0
  34. package/iter/bartlett-hann-pulse/docs/types/index.d.ts +105 -0
  35. package/iter/bartlett-hann-pulse/docs/types/test.ts +89 -0
  36. package/iter/bartlett-hann-pulse/lib/index.js +54 -0
  37. package/iter/bartlett-hann-pulse/lib/main.js +192 -0
  38. package/iter/bartlett-hann-pulse/lib/validate.js +97 -0
  39. package/iter/bartlett-hann-pulse/package.json +76 -0
  40. package/iter/bartlett-pulse/README.md +328 -0
  41. package/iter/bartlett-pulse/docs/img/equation_bartlett_pulse_waveform.svg +128 -0
  42. package/iter/bartlett-pulse/docs/repl.txt +54 -0
  43. package/iter/bartlett-pulse/docs/types/index.d.ts +105 -0
  44. package/iter/bartlett-pulse/docs/types/test.ts +89 -0
  45. package/iter/bartlett-pulse/lib/index.js +54 -0
  46. package/iter/bartlett-pulse/lib/main.js +169 -0
  47. package/iter/bartlett-pulse/lib/validate.js +97 -0
  48. package/iter/bartlett-pulse/package.json +72 -0
  49. package/iter/cosine-wave/README.md +292 -0
  50. package/iter/cosine-wave/docs/img/equation_cosine_waveform.svg +55 -0
  51. package/iter/cosine-wave/docs/repl.txt +51 -0
  52. package/iter/cosine-wave/docs/types/index.d.ts +96 -0
  53. package/iter/cosine-wave/docs/types/test.ts +78 -0
  54. package/iter/cosine-wave/lib/index.js +54 -0
  55. package/iter/cosine-wave/lib/main.js +156 -0
  56. package/iter/cosine-wave/lib/validate.js +90 -0
  57. package/iter/cosine-wave/package.json +70 -0
  58. package/iter/dirac-comb/README.md +278 -0
  59. package/iter/dirac-comb/docs/img/equation_dirac_comb.svg +44 -0
  60. package/iter/dirac-comb/docs/repl.txt +48 -0
  61. package/iter/dirac-comb/docs/types/index.d.ts +89 -0
  62. package/iter/dirac-comb/docs/types/test.ts +78 -0
  63. package/iter/dirac-comb/lib/index.js +54 -0
  64. package/iter/dirac-comb/lib/main.js +152 -0
  65. package/iter/dirac-comb/lib/validate.js +82 -0
  66. package/iter/dirac-comb/package.json +72 -0
  67. package/iter/docs/types/index.d.ts +678 -0
  68. package/iter/docs/types/test.ts +29 -0
  69. package/iter/flat-top-pulse/README.md +330 -0
  70. package/iter/flat-top-pulse/docs/img/equation_flat_top_pulse_waveform.svg +177 -0
  71. package/iter/flat-top-pulse/docs/repl.txt +54 -0
  72. package/iter/flat-top-pulse/docs/types/index.d.ts +105 -0
  73. package/iter/flat-top-pulse/docs/types/test.ts +89 -0
  74. package/iter/flat-top-pulse/lib/index.js +54 -0
  75. package/iter/flat-top-pulse/lib/main.js +193 -0
  76. package/iter/flat-top-pulse/lib/validate.js +97 -0
  77. package/iter/flat-top-pulse/package.json +71 -0
  78. package/iter/hann-pulse/README.md +328 -0
  79. package/iter/hann-pulse/docs/img/equation_hann_pulse_waveform.svg +129 -0
  80. package/iter/hann-pulse/docs/repl.txt +54 -0
  81. package/iter/hann-pulse/docs/types/index.d.ts +105 -0
  82. package/iter/hann-pulse/docs/types/test.ts +89 -0
  83. package/iter/hann-pulse/lib/index.js +54 -0
  84. package/iter/hann-pulse/lib/main.js +171 -0
  85. package/iter/hann-pulse/lib/validate.js +97 -0
  86. package/iter/hann-pulse/package.json +72 -0
  87. package/iter/lanczos-pulse/README.md +325 -0
  88. package/iter/lanczos-pulse/docs/img/equation_lanczos_pulse_waveform.svg +122 -0
  89. package/iter/lanczos-pulse/docs/repl.txt +54 -0
  90. package/iter/lanczos-pulse/docs/types/index.d.ts +105 -0
  91. package/iter/lanczos-pulse/docs/types/test.ts +89 -0
  92. package/iter/lanczos-pulse/lib/index.js +54 -0
  93. package/iter/lanczos-pulse/lib/main.js +169 -0
  94. package/iter/lanczos-pulse/lib/validate.js +97 -0
  95. package/iter/lanczos-pulse/package.json +70 -0
  96. package/iter/lib/index.js +186 -0
  97. package/iter/package.json +63 -0
  98. package/iter/periodic-sinc/README.md +301 -0
  99. package/iter/periodic-sinc/docs/img/equation_periodic_sinc.svg +146 -0
  100. package/iter/periodic-sinc/docs/img/equation_periodic_sinc_in_terms_of_period.svg +164 -0
  101. package/iter/periodic-sinc/docs/img/equation_periodic_sinc_in_terms_of_sinc_function.svg +65 -0
  102. package/iter/periodic-sinc/docs/img/equation_periodic_sinc_substitution_even.svg +34 -0
  103. package/iter/periodic-sinc/docs/img/equation_periodic_sinc_substitution_odd.svg +34 -0
  104. package/iter/periodic-sinc/docs/repl.txt +54 -0
  105. package/iter/periodic-sinc/docs/types/index.d.ts +98 -0
  106. package/iter/periodic-sinc/docs/types/test.ts +102 -0
  107. package/iter/periodic-sinc/lib/index.js +50 -0
  108. package/iter/periodic-sinc/lib/main.js +241 -0
  109. package/iter/periodic-sinc/lib/validate.js +90 -0
  110. package/iter/periodic-sinc/package.json +70 -0
  111. package/iter/pulse/README.md +322 -0
  112. package/iter/pulse/docs/img/equation_pulse_waveform.svg +115 -0
  113. package/iter/pulse/docs/repl.txt +58 -0
  114. package/iter/pulse/docs/types/index.d.ts +109 -0
  115. package/iter/pulse/docs/types/test.ts +100 -0
  116. package/iter/pulse/lib/index.js +54 -0
  117. package/iter/pulse/lib/main.js +165 -0
  118. package/iter/pulse/lib/validate.js +105 -0
  119. package/iter/pulse/package.json +69 -0
  120. package/iter/sawtooth-wave/README.md +289 -0
  121. package/iter/sawtooth-wave/docs/img/equation_sawtooth_waveform.svg +73 -0
  122. package/iter/sawtooth-wave/docs/repl.txt +51 -0
  123. package/iter/sawtooth-wave/docs/types/index.d.ts +96 -0
  124. package/iter/sawtooth-wave/docs/types/test.ts +78 -0
  125. package/iter/sawtooth-wave/lib/index.js +54 -0
  126. package/iter/sawtooth-wave/lib/main.js +161 -0
  127. package/iter/sawtooth-wave/lib/validate.js +90 -0
  128. package/iter/sawtooth-wave/package.json +67 -0
  129. package/iter/sine-wave/README.md +292 -0
  130. package/iter/sine-wave/docs/img/equation_sine_waveform.svg +55 -0
  131. package/iter/sine-wave/docs/repl.txt +51 -0
  132. package/iter/sine-wave/docs/types/index.d.ts +96 -0
  133. package/iter/sine-wave/docs/types/test.ts +78 -0
  134. package/iter/sine-wave/lib/index.js +54 -0
  135. package/iter/sine-wave/lib/main.js +156 -0
  136. package/iter/sine-wave/lib/validate.js +90 -0
  137. package/iter/sine-wave/package.json +70 -0
  138. package/iter/square-wave/README.md +291 -0
  139. package/iter/square-wave/docs/img/equation_square_waveform.svg +115 -0
  140. package/iter/square-wave/docs/repl.txt +55 -0
  141. package/iter/square-wave/docs/types/index.d.ts +105 -0
  142. package/iter/square-wave/docs/types/test.ts +89 -0
  143. package/iter/square-wave/lib/index.js +54 -0
  144. package/iter/square-wave/lib/main.js +156 -0
  145. package/iter/square-wave/lib/validate.js +99 -0
  146. package/iter/square-wave/package.json +67 -0
  147. package/iter/triangle-wave/README.md +289 -0
  148. package/iter/triangle-wave/docs/img/equation_triangle_waveform.svg +75 -0
  149. package/iter/triangle-wave/docs/repl.txt +51 -0
  150. package/iter/triangle-wave/docs/types/index.d.ts +96 -0
  151. package/iter/triangle-wave/docs/types/test.ts +78 -0
  152. package/iter/triangle-wave/lib/index.js +54 -0
  153. package/iter/triangle-wave/lib/main.js +160 -0
  154. package/iter/triangle-wave/lib/validate.js +90 -0
  155. package/iter/triangle-wave/package.json +66 -0
  156. package/lib/index.js +51 -0
  157. 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;