@@ -76,8 +76,9 @@ if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 4.0, *) {
76
76
77
77
if #available( iOS 9999 , macOS 9999 , tvOS 9999 , watchOS 9999 , * ) {
78
78
79
+ let n = 1024
80
+
79
81
AccelerateTests . test ( " vDSP/DiscreteCosineTransform " ) {
80
- let n = 1024
81
82
82
83
let source = ( 0 ..< n) . map { i in
83
84
return sin ( Float ( i) * 0.05 ) + sin( Float ( i) * 0.025 )
@@ -109,19 +110,16 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
109
110
source,
110
111
& legacyDestination)
111
112
112
- expectTrue ( destination . elementsEqual ( legacyDestination) )
113
- expectTrue ( destination . elementsEqual ( returnedResult) )
113
+ expectTrue ( elementsAlmostEqual ( destination , legacyDestination) )
114
+ expectTrue ( elementsAlmostEqual ( destination , returnedResult) )
114
115
}
115
116
}
116
- }
117
-
118
- //===----------------------------------------------------------------------===//
119
- //
120
- // Sliding window summation
121
- //
122
- //===----------------------------------------------------------------------===//
123
117
124
- if #available( iOS 9999 , macOS 9999 , tvOS 9999 , watchOS 9999 , * ) {
118
+ //===----------------------------------------------------------------------===//
119
+ //
120
+ // Sliding window summation
121
+ //
122
+ //===----------------------------------------------------------------------===//
125
123
126
124
AccelerateTests . test ( " vDSP/SinglePrecisionSlidingWindowSum " ) {
127
125
let source : [ Float ] = [ 1 , 10 , 12 , 9 , 3 , 7 , 2 , 6 ]
@@ -134,7 +132,7 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
134
132
let returnedResult = vDSP. slidingWindowSum ( source,
135
133
usingWindowLength: 3 )
136
134
137
- expectTrue ( destination . elementsEqual ( returnedResult) )
135
+ expectTrue ( elementsAlmostEqual ( destination , returnedResult) )
138
136
expectTrue ( destination. map { Int ( $0) } . elementsEqual ( [ 23 , 31 , 24 , 19 , 12 , 15 ] ) )
139
137
}
140
138
@@ -149,22 +147,15 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
149
147
let returnedResult = vDSP. slidingWindowSum ( source,
150
148
usingWindowLength: 3 )
151
149
152
- expectTrue ( destination. elementsEqual ( returnedResult) )
153
-
150
+ expectTrue ( elementsAlmostEqual ( destination, returnedResult) )
154
151
expectTrue ( destination. map { Int ( $0) } . elementsEqual ( [ 23 , 31 , 24 , 19 , 12 , 15 ] ) )
155
152
}
156
153
157
- }
158
-
159
- //===----------------------------------------------------------------------===//
160
- //
161
- // Linear interpolation
162
- //
163
- //===----------------------------------------------------------------------===//
164
-
165
- if #available( iOS 9999 , macOS 9999 , tvOS 9999 , watchOS 9999 , * ) {
166
-
167
- let n = 1024
154
+ //===----------------------------------------------------------------------===//
155
+ //
156
+ // Linear interpolation
157
+ //
158
+ //===----------------------------------------------------------------------===//
168
159
169
160
AccelerateTests . test ( " vDSP/SinglePrecisionInterpolateBetweenVectors " ) {
170
161
var result = [ Float] ( repeating: 0 , count: n)
@@ -193,8 +184,8 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
193
184
let returnedResult = vDSP. linearInterpolate ( a, b,
194
185
using: interpolationConstant)
195
186
196
- expectTrue ( result . elementsEqual ( legacyResult) )
197
- expectTrue ( result . elementsEqual ( returnedResult) )
187
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
188
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
198
189
}
199
190
200
191
AccelerateTests . test ( " vDSP/SinglePrecisionInterpolateBetweenNeighbours " ) {
@@ -229,8 +220,8 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
229
220
let returnedResult = vDSP. linearInterpolate ( elementsOf: shortSignal,
230
221
using: controlVector)
231
222
232
- expectTrue ( result . elementsEqual ( legacyResult) )
233
- expectTrue ( result . elementsEqual ( returnedResult) )
223
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
224
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
234
225
}
235
226
236
227
AccelerateTests . test ( " vDSP/DoublePrecisionInterpolateBetweenVectors " ) {
@@ -260,8 +251,8 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
260
251
let returnedResult = vDSP. linearInterpolate ( a, b,
261
252
using: interpolationConstant)
262
253
263
- expectTrue ( result . elementsEqual ( legacyResult) )
264
- expectTrue ( result . elementsEqual ( returnedResult) )
254
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
255
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
265
256
}
266
257
267
258
AccelerateTests . test ( " vDSP/DoublePrecisionInterpolateBetweenNeighbours " ) {
@@ -296,19 +287,16 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
296
287
let returnedResult = vDSP. linearInterpolate ( elementsOf: shortSignal,
297
288
using: controlVector)
298
289
299
- expectTrue ( result . elementsEqual ( legacyResult) )
300
- expectTrue ( result . elementsEqual ( returnedResult) )
290
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
291
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
301
292
}
302
- }
303
293
304
- //===----------------------------------------------------------------------===//
305
- //
306
- // vDSP difference equation
307
- //
308
- //===----------------------------------------------------------------------===//
294
+ //===----------------------------------------------------------------------===//
295
+ //
296
+ // vDSP difference equation
297
+ //
298
+ //===----------------------------------------------------------------------===//
309
299
310
- if #available( iOS 9999 , macOS 9999 , tvOS 9999 , watchOS 9999 , * ) {
311
-
312
300
AccelerateTests . test ( " vDSP/DifferenceEquationSinglePrecision " ) {
313
301
let n = 256
314
302
@@ -343,8 +331,8 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
343
331
coefficients [ 3 ] ,
344
332
coefficients [ 4 ] ) )
345
333
346
- expectTrue ( result . elementsEqual ( legacyResult) )
347
- expectTrue ( result . elementsEqual ( returnedResult) )
334
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
335
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
348
336
}
349
337
350
338
AccelerateTests . test ( " vDSP/DifferenceEquationDoublePrecision " ) {
@@ -381,18 +369,16 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
381
369
coefficients [ 3 ] ,
382
370
coefficients [ 4 ] ) )
383
371
384
- expectTrue ( result . elementsEqual ( legacyResult) )
385
- expectTrue ( result . elementsEqual ( returnedResult) )
372
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
373
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
386
374
}
387
- }
388
375
389
- //===----------------------------------------------------------------------===//
390
- //
391
- // vDSP downsampling
392
- //
393
- //===----------------------------------------------------------------------===//
376
+ //===----------------------------------------------------------------------===//
377
+ //
378
+ // vDSP downsampling
379
+ //
380
+ //===----------------------------------------------------------------------===//
394
381
395
- if #available( iOS 9999 , macOS 9999 , tvOS 9999 , watchOS 9999 , * ) {
396
382
AccelerateTests . test ( " vDSP/DownsampleSinglePrecision " ) {
397
383
let decimationFactor = 2
398
384
let filterLength : vDSP_Length = 2
@@ -429,8 +415,8 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
429
415
decimationFactor: decimationFactor,
430
416
filter: filter)
431
417
432
- expectTrue ( result . elementsEqual ( legacyResult) )
433
- expectTrue ( result . elementsEqual ( returnedResult) )
418
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
419
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
434
420
}
435
421
436
422
AccelerateTests . test ( " vDSP/DownsampleDoublePrecision " ) {
@@ -469,19 +455,16 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
469
455
decimationFactor: decimationFactor,
470
456
filter: filter)
471
457
472
- expectTrue ( result . elementsEqual ( legacyResult) )
473
- expectTrue ( result . elementsEqual ( returnedResult) )
458
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
459
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
474
460
}
475
- }
476
461
477
- //===----------------------------------------------------------------------===//
478
- //
479
- // vDSP polynomial evaluation.
480
- //
481
- //===----------------------------------------------------------------------===//
462
+ //===----------------------------------------------------------------------===//
463
+ //
464
+ // vDSP polynomial evaluation.
465
+ //
466
+ //===----------------------------------------------------------------------===//
482
467
483
- if #available( iOS 9999 , macOS 9999 , tvOS 9999 , watchOS 9999 , * ) {
484
-
485
468
AccelerateTests . test ( " vDSP/PolynomialEvaluationSinglePrecision " ) {
486
469
let coefficients : [ Float ] = [ 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
487
470
let variables = ( 0 ... 100 ) . map { return Float ( $0) }
@@ -502,8 +485,8 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
502
485
let returnedResult = vDSP. evaluatePolynomial ( usingCoefficients: coefficients,
503
486
withVariables: variables)
504
487
505
- expectTrue ( result . elementsEqual ( legacyResult) )
506
- expectTrue ( result . elementsEqual ( returnedResult) )
488
+ expectTrue ( elementsAlmostEqual ( result , legacyResult) )
489
+ expectTrue ( elementsAlmostEqual ( result , returnedResult) )
507
490
}
508
491
509
492
AccelerateTests . test ( " vDSP/PolynomialEvaluationDoublePrecision " ) {
@@ -526,8 +509,53 @@ if #available(iOS 9999, macOS 9999, tvOS 9999, watchOS 9999, *) {
526
509
let returnedResult = vDSP. evaluatePolynomial ( usingCoefficients: coefficients,
527
510
withVariables: variables)
528
511
529
- expectTrue ( result. elementsEqual ( legacyResult) )
530
- expectTrue ( result. elementsEqual ( returnedResult) )
512
+ expectTrue ( elementsAlmostEqual ( result, legacyResult) )
513
+ expectTrue ( elementsAlmostEqual ( result, returnedResult) )
514
+ }
515
+
516
+ //===----------------------------------------------------------------------===//
517
+ //
518
+ // Array almost equal.
519
+ //
520
+ //===----------------------------------------------------------------------===//
521
+
522
+ func elementsAlmostEqual< T: FloatingPoint > ( _ lhs: [ T ] , _ rhs: [ T ] ) -> Bool {
523
+ var returnValue = true
524
+ zip ( lhs, rhs) . forEach {
525
+ if !isAlmostEqual( $0. 0 , $0. 1 ) {
526
+ returnValue = false
527
+ return
528
+ }
529
+ }
530
+ return returnValue
531
+ }
532
+
533
+ func isAlmostEqual< T: FloatingPoint > ( _ lhs: T ,
534
+ _ rhs: T ,
535
+ tolerance: T = T . ulpOfOne. squareRoot ( ) ) -> Bool {
536
+ assert ( tolerance >= . ulpOfOne && tolerance < 1 , " tolerance should be in [.ulpOfOne, 1). " )
537
+ guard lhs. isFinite && rhs. isFinite else {
538
+ return rescaledAlmostEqual ( lhs, rhs, tolerance: tolerance)
539
+ }
540
+ let scale = max ( abs ( lhs) , abs ( rhs) , . leastNormalMagnitude)
541
+ return abs ( lhs - rhs) < scale*tolerance
542
+ }
543
+
544
+ func rescaledAlmostEqual< T: FloatingPoint > ( _ lhs: T ,
545
+ _ rhs: T ,
546
+ tolerance: T ) -> Bool {
547
+ if lhs. isNaN || rhs. isNaN { return false }
548
+ if lhs. isInfinite {
549
+ if rhs. isInfinite { return lhs == rhs }
550
+ let scaledLhs = T ( sign: lhs. sign,
551
+ exponent: T . greatestFiniteMagnitude. exponent,
552
+ significand: 1 )
553
+ let scaledRhs = T ( sign: . plus,
554
+ exponent: - 1 ,
555
+ significand: rhs)
556
+ return isAlmostEqual ( scaledLhs, scaledRhs, tolerance: tolerance)
557
+ }
558
+ return rescaledAlmostEqual ( rhs, lhs, tolerance: tolerance)
531
559
}
532
560
}
533
561
0 commit comments