21
21
// MODULES //
22
22
23
23
var tape = require ( 'tape' ) ;
24
- var floor = require ( '@stdlib/math/base/special/floor' ) ;
25
24
var isnan = require ( '@stdlib/math/base/assert/is-nan' ) ;
25
+ var toAccessorArray = require ( '@stdlib/array/base/to-accessor-array' ) ;
26
26
var Float64Array = require ( '@stdlib/array/float64' ) ;
27
27
var gcusum = require ( './../lib' ) ;
28
28
@@ -128,6 +128,94 @@ tape( 'the function computes the cumulative sum', function test( t ) {
128
128
t . end ( ) ;
129
129
} ) ;
130
130
131
+ tape ( 'the function computes the cumulative sum (accessors)' , function test ( t ) {
132
+ var expected ;
133
+ var x ;
134
+ var y ;
135
+ var i ;
136
+
137
+ x = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ] ;
138
+ y = [ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ] ;
139
+
140
+ gcusum ( x . length , 0.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 1 ) ;
141
+ expected = [
142
+ 1.0 ,
143
+ 3.0 ,
144
+ 6.0 ,
145
+ 10.0 ,
146
+ 15.0
147
+ ] ;
148
+ t . deepEqual ( y , expected , 'returns expected value' ) ;
149
+
150
+ x = [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ] ;
151
+ y = [ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ] ;
152
+
153
+ gcusum ( x . length , 10.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 1 ) ;
154
+ expected = [
155
+ 11.0 ,
156
+ 13.0 ,
157
+ 16.0 ,
158
+ 20.0 ,
159
+ 25.0
160
+ ] ;
161
+ t . deepEqual ( y , expected , 'returns expected value' ) ;
162
+
163
+ x = [ NaN , NaN ] ;
164
+ y = [ 0.0 , 0.0 ] ;
165
+ gcusum ( x . length , 0.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 1 ) ;
166
+
167
+ for ( i = 0 ; i < y . length ; i ++ ) {
168
+ t . strictEqual ( isnan ( y [ i ] ) , true , 'returns expected value. i: ' + i ) ;
169
+ }
170
+
171
+ x = [ 1.0 , NaN , 3.0 , NaN ] ;
172
+ y = [ 0.0 , 0.0 , 0.0 , 0.0 ] ;
173
+ gcusum ( x . length , 0.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 1 ) ;
174
+
175
+ expected = [
176
+ 1.0 ,
177
+ NaN ,
178
+ NaN ,
179
+ NaN
180
+ ] ;
181
+ for ( i = 0 ; i < y . length ; i ++ ) {
182
+ if ( isnan ( expected [ i ] ) ) {
183
+ t . strictEqual ( isnan ( y [ i ] ) , true , 'returns expected value. i: ' + i ) ;
184
+ } else {
185
+ t . strictEqual ( y [ i ] , expected [ i ] , true , 'returns expected value. i: ' + i ) ;
186
+ }
187
+ }
188
+
189
+ x = [ 1.0 , 1.0e100 , 1.0 , - 1.0e100 ] ;
190
+ y = [ 0.0 , 0.0 , 0.0 , 0.0 ] ;
191
+ gcusum ( x . length , 0.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 1 ) ;
192
+
193
+ expected = [
194
+ 1.0 ,
195
+ 1.0e100 ,
196
+ 1.0e100 ,
197
+ 2.0
198
+ ] ;
199
+ t . deepEqual ( y , expected , 'returns expected value' ) ;
200
+
201
+ x = [ ] ;
202
+ y = [ ] ;
203
+ expected = [ ] ;
204
+ for ( i = 0 ; i < 1e3 ; i ++ ) {
205
+ x . push ( i + 1 ) ;
206
+ y . push ( 0.0 ) ;
207
+ if ( i === 0 ) {
208
+ expected . push ( x [ i ] ) ;
209
+ } else {
210
+ expected . push ( expected [ i - 1 ] + x [ i ] ) ;
211
+ }
212
+ }
213
+ gcusum ( x . length , 0.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 1 ) ;
214
+ t . deepEqual ( y , expected , 'returns expected value' ) ;
215
+
216
+ t . end ( ) ;
217
+ } ) ;
218
+
131
219
tape ( 'the function returns a reference to the output array' , function test ( t ) {
132
220
var out ;
133
221
var x ;
@@ -142,6 +230,20 @@ tape( 'the function returns a reference to the output array', function test( t )
142
230
t . end ( ) ;
143
231
} ) ;
144
232
233
+ tape ( 'the function returns a reference to the output array (accessors)' , function test ( t ) {
234
+ var out ;
235
+ var x ;
236
+ var y ;
237
+
238
+ x = toAccessorArray ( [ 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ] ) ;
239
+ y = toAccessorArray ( [ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 ] ) ;
240
+
241
+ out = gcusum ( x . length , 0.0 , x , 1 , y , 1 ) ;
242
+
243
+ t . strictEqual ( out , y , 'same reference' ) ;
244
+ t . end ( ) ;
245
+ } ) ;
246
+
145
247
tape ( 'if provided an `N` parameter less than or equal to `0`, the function returns `y` unchanged' , function test ( t ) {
146
248
var expected ;
147
249
var x ;
@@ -165,7 +267,6 @@ tape( 'the function supports an `x` stride', function test( t ) {
165
267
var expected ;
166
268
var x ;
167
269
var y ;
168
- var N ;
169
270
170
271
x = [
171
272
1.0 , // 0
@@ -181,9 +282,36 @@ tape( 'the function supports an `x` stride', function test( t ) {
181
282
0.0 ,
182
283
0.0
183
284
] ;
184
- N = 3 ;
185
285
186
- gcusum ( N , 0.0 , x , 2 , y , 1 ) ;
286
+ gcusum ( 3 , 0.0 , x , 2 , y , 1 ) ;
287
+
288
+ expected = [ 1.0 , 4.0 , 9.0 , 0.0 , 0.0 ] ;
289
+
290
+ t . deepEqual ( y , expected , 'deep equal' ) ;
291
+ t . end ( ) ;
292
+ } ) ;
293
+
294
+ tape ( 'the function supports an `x` stride (accessors)' , function test ( t ) {
295
+ var expected ;
296
+ var x ;
297
+ var y ;
298
+
299
+ x = [
300
+ 1.0 , // 0
301
+ 2.0 ,
302
+ 3.0 , // 1
303
+ 4.0 ,
304
+ 5.0 // 2
305
+ ] ;
306
+ y = [
307
+ 0.0 , // 0
308
+ 0.0 , // 1
309
+ 0.0 , // 2
310
+ 0.0 ,
311
+ 0.0
312
+ ] ;
313
+
314
+ gcusum ( 3 , 0.0 , toAccessorArray ( x ) , 2 , toAccessorArray ( y ) , 1 ) ;
187
315
188
316
expected = [ 1.0 , 4.0 , 9.0 , 0.0 , 0.0 ] ;
189
317
@@ -195,7 +323,6 @@ tape( 'the function supports a `y` stride', function test( t ) {
195
323
var expected ;
196
324
var x ;
197
325
var y ;
198
- var N ;
199
326
200
327
x = [
201
328
1.0 , // 0
@@ -211,9 +338,36 @@ tape( 'the function supports a `y` stride', function test( t ) {
211
338
0.0 ,
212
339
0.0 // 2
213
340
] ;
214
- N = 3 ;
215
341
216
- gcusum ( N , 0.0 , x , 1 , y , 2 ) ;
342
+ gcusum ( 3 , 0.0 , x , 1 , y , 2 ) ;
343
+
344
+ expected = [ 1.0 , 0.0 , 3.0 , 0.0 , 6.0 ] ;
345
+
346
+ t . deepEqual ( y , expected , 'deep equal' ) ;
347
+ t . end ( ) ;
348
+ } ) ;
349
+
350
+ tape ( 'the function supports a `y` stride (accessors)' , function test ( t ) {
351
+ var expected ;
352
+ var x ;
353
+ var y ;
354
+
355
+ x = [
356
+ 1.0 , // 0
357
+ 2.0 , // 1
358
+ 3.0 , // 2
359
+ 4.0 ,
360
+ 5.0
361
+ ] ;
362
+ y = [
363
+ 0.0 , // 0
364
+ 0.0 ,
365
+ 0.0 , // 1
366
+ 0.0 ,
367
+ 0.0 // 2
368
+ ] ;
369
+
370
+ gcusum ( 3 , 0.0 , toAccessorArray ( x ) , 1 , toAccessorArray ( y ) , 2 ) ;
217
371
218
372
expected = [ 1.0 , 0.0 , 3.0 , 0.0 , 6.0 ] ;
219
373
@@ -225,7 +379,6 @@ tape( 'the function supports negative strides', function test( t ) {
225
379
var expected ;
226
380
var x ;
227
381
var y ;
228
- var N ;
229
382
230
383
x = [
231
384
1.0 , // 2
@@ -241,9 +394,36 @@ tape( 'the function supports negative strides', function test( t ) {
241
394
0.0 ,
242
395
0.0
243
396
] ;
244
- N = 3 ;
245
397
246
- gcusum ( N , 0.0 , x , - 2 , y , - 1 ) ;
398
+ gcusum ( 3 , 0.0 , x , - 2 , y , - 1 ) ;
399
+
400
+ expected = [ 9.0 , 8.0 , 5.0 , 0.0 , 0.0 ] ;
401
+
402
+ t . deepEqual ( y , expected , 'deep equal' ) ;
403
+ t . end ( ) ;
404
+ } ) ;
405
+
406
+ tape ( 'the function supports negative strides (accessors)' , function test ( t ) {
407
+ var expected ;
408
+ var x ;
409
+ var y ;
410
+
411
+ x = [
412
+ 1.0 , // 2
413
+ 2.0 ,
414
+ 3.0 , // 1
415
+ 4.0 ,
416
+ 5.0 // 0
417
+ ] ;
418
+ y = [
419
+ 0.0 , // 2
420
+ 0.0 , // 1
421
+ 0.0 , // 0
422
+ 0.0 ,
423
+ 0.0
424
+ ] ;
425
+
426
+ gcusum ( 3 , 0.0 , toAccessorArray ( x ) , - 2 , toAccessorArray ( y ) , - 1 ) ;
247
427
248
428
expected = [ 9.0 , 8.0 , 5.0 , 0.0 , 0.0 ] ;
249
429
@@ -255,7 +435,6 @@ tape( 'the function supports complex access patterns', function test( t ) {
255
435
var expected ;
256
436
var x ;
257
437
var y ;
258
- var N ;
259
438
260
439
x = [
261
440
1.0 , // 0
@@ -273,9 +452,8 @@ tape( 'the function supports complex access patterns', function test( t ) {
273
452
0.0 ,
274
453
0.0
275
454
] ;
276
- N = 3 ;
277
455
278
- gcusum ( N , 0.0 , x , 2 , y , - 1 ) ;
456
+ gcusum ( 3 , 0.0 , x , 2 , y , - 1 ) ;
279
457
280
458
expected = [ 9.0 , 4.0 , 1.0 , 0.0 , 0.0 , 0.0 ] ;
281
459
@@ -289,7 +467,6 @@ tape( 'the function supports view offsets', function test( t ) {
289
467
var y0 ;
290
468
var x1 ;
291
469
var y1 ;
292
- var N ;
293
470
294
471
// Initial arrays...
295
472
x0 = new Float64Array ( [
@@ -313,9 +490,7 @@ tape( 'the function supports view offsets', function test( t ) {
313
490
x1 = new Float64Array ( x0 . buffer , x0 . BYTES_PER_ELEMENT * 1 ) ; // begin at 2nd element
314
491
y1 = new Float64Array ( y0 . buffer , y0 . BYTES_PER_ELEMENT * 3 ) ; // begin at the 4th element
315
492
316
- N = floor ( x0 . length / 2 ) ;
317
-
318
- gcusum ( N , 0.0 , x1 , - 2 , y1 , 1 ) ;
493
+ gcusum ( 3 , 0.0 , x1 , - 2 , y1 , 1 ) ;
319
494
expected = new Float64Array ( [ 0.0 , 0.0 , 0.0 , 6.0 , 10.0 , 12.0 ] ) ;
320
495
321
496
t . deepEqual ( y0 , expected , 'deep equal' ) ;
0 commit comments