blob: 76a707ccd2ab0cb2a46409d2ab020d7dde62f3ac [file] [log] [blame] [edit]
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// REQUIRES: rdar50301438
// REQUIRES: objc_interop
// UNSUPPORTED: OS=watchos
import StdlibUnittest
import Accelerate
var Accelerate_vDSPConvolutionTests = TestSuite("Accelerate_vDSPConvolution")
//===----------------------------------------------------------------------===//
//
// vDSP Single-precision 1D convolution and correlation
//
//===----------------------------------------------------------------------===//
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) {
let count = 256
let n = vDSP_Length(256)
let kernel: [Float] = ( 0 ..< 10 ).map {
return Float($0) / 45
}
let signal: [Float] = (0 ..< 256 + 10).map {
return sin(Float($0) * 0.05).sign == .minus ? -1 : 1
}
Accelerate_vDSPConvolutionTests.test("vDSP/SinglePrecisionConvolve") {
var result = [Float](repeating: 0,
count: count)
vDSP.convolve(signal,
withKernel: kernel,
result: &result)
var legacyResult = [Float](repeating: -1,
count: count)
vDSP_conv(signal, 1,
UnsafePointer(kernel).advanced(by: kernel.count - 1), -1,
&legacyResult, 1,
n,
vDSP_Length(kernel.count))
let returnedResult = vDSP.convolve(signal,
withKernel: kernel)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
Accelerate_vDSPConvolutionTests.test("vDSP/SinglePrecisionCorrelate") {
var result = [Float](repeating: 0,
count: count)
vDSP.correlate(signal,
withKernel: kernel,
result: &result)
var legacyResult = [Float](repeating: -1,
count: count)
vDSP_conv(signal, 1,
kernel, 1,
&legacyResult, 1,
n,
vDSP_Length(kernel.count))
let returnedResult = vDSP.correlate(signal,
withKernel: kernel)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
}
//===----------------------------------------------------------------------===//
//
// vDSP Double-precision 1D convolution and correlation
//
//===----------------------------------------------------------------------===//
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) {
let count = 256
let n = vDSP_Length(256)
let kernel: [Double] = ( 0 ..< 10 ).map {
return Double($0) / 45
}
let signal: [Double] = (0 ..< 256 + 10).map {
return sin(Double($0) * 0.05).sign == .minus ? -1 : 1
}
Accelerate_vDSPConvolutionTests.test("vDSP/DoublePrecisionConvolve") {
var result = [Double](repeating: 0,
count: count)
vDSP.convolve(signal,
withKernel: kernel,
result: &result)
var legacyResult = [Double](repeating: -1,
count: count)
vDSP_convD(signal, 1,
UnsafePointer(kernel).advanced(by: kernel.count - 1), -1,
&legacyResult, 1,
n,
vDSP_Length(kernel.count))
let returnedResult = vDSP.convolve(signal,
withKernel: kernel)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
Accelerate_vDSPConvolutionTests.test("vDSP/DoublePrecisionCorrelate") {
var result = [Double](repeating: 0,
count: count)
vDSP.correlate(signal,
withKernel: kernel,
result: &result)
var legacyResult = [Double](repeating: -1,
count: count)
vDSP_convD(signal, 1,
kernel, 1,
&legacyResult, 1,
n,
vDSP_Length(kernel.count))
let returnedResult = vDSP.correlate(signal,
withKernel: kernel)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
}
//===----------------------------------------------------------------------===//
//
// vDSP Single-precision 2D convolution
//
//===----------------------------------------------------------------------===//
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) {
let width = 512
let height = 128
let pixelCount = 512 * 128
let pixels: [Float] = (0 ..< pixelCount).map { i in
let x = floor(Float(i) / 1024) * 25
let y = remainder(Float(i), 1024) * 25
return (sin(y).sign == .minus && sin(x).sign == .minus) ? 0 : 1
}
Accelerate_vDSPConvolutionTests.test("vDSP/SinglePrecision3x3") {
let kernel3x3 = [Float](repeating: 1.0 / 9, count: 9)
var result = [Float](repeating: .nan,
count: pixelCount)
vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with3x3Kernel: kernel3x3,
result: &result)
var legacyResult = [Float](repeating: -1,
count: result.count)
vDSP_f3x3(pixels,
vDSP_Length(height), vDSP_Length(width),
kernel3x3,
&legacyResult)
let returnedResult = vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with3x3Kernel: kernel3x3)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
Accelerate_vDSPConvolutionTests.test("vDSP/SinglePrecision5x5") {
let kernel5x5 = [Float](repeating: 1.0 / 25, count: 25)
var result = [Float](repeating: .nan,
count: pixelCount)
vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with5x5Kernel: kernel5x5,
result: &result)
var legacyResult = [Float](repeating: -1,
count: result.count)
vDSP_f5x5(pixels,
vDSP_Length(height), vDSP_Length(width),
kernel5x5,
&legacyResult)
let returnedResult = vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with5x5Kernel: kernel5x5)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
Accelerate_vDSPConvolutionTests.test("vDSP/SinglePrecision7x3") {
let kernel7x3 = [Float](repeating: 1.0 / (7 * 3), count: 7 * 3)
var result = [Float](repeating: .nan,
count: pixelCount)
vDSP.convolve(pixels,
rowCount: height, columnCount: width,
withKernel: kernel7x3,
kernelRowCount: 7, kernelColumnCount: 3,
result: &result)
var legacyResult = [Float](repeating: -1,
count: result.count)
vDSP_imgfir(pixels,
vDSP_Length(height), vDSP_Length(width),
kernel7x3,
&legacyResult,
7, 3)
let returnedResult = vDSP.convolve(pixels,
rowCount: height, columnCount: width,
withKernel: kernel7x3,
kernelRowCount: 7, kernelColumnCount: 3)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
}
//===----------------------------------------------------------------------===//
//
// vDSP Double-precision 2D convolution
//
//===----------------------------------------------------------------------===//
if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) {
let width = 512
let height = 128
let pixelCount = 512 * 128
let pixels: [Double] = (0 ..< pixelCount).map { i in
let x = floor(Double(i) / 1024) * 25
let y = remainder(Double(i), 1024) * 25
return (sin(y).sign == .minus && sin(x).sign == .minus) ? 0 : 1
}
Accelerate_vDSPConvolutionTests.test("vDSP/DoublePrecision3x3") {
let kernel3x3 = [Double](repeating: 1.0 / 9, count: 9)
var result = [Double](repeating: .nan,
count: pixelCount)
vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with3x3Kernel: kernel3x3,
result: &result)
var legacyResult = [Double](repeating: -1,
count: result.count)
vDSP_f3x3D(pixels,
vDSP_Length(height), vDSP_Length(width),
kernel3x3,
&legacyResult)
let returnedResult = vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with3x3Kernel: kernel3x3)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
Accelerate_vDSPConvolutionTests.test("vDSP/DoublePrecision5x5") {
let kernel5x5 = [Double](repeating: 1.0 / 25, count: 25)
var result = [Double](repeating: .nan,
count: pixelCount)
vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with5x5Kernel: kernel5x5,
result: &result)
var legacyResult = [Double](repeating: -1,
count: result.count)
vDSP_f5x5D(pixels,
vDSP_Length(height), vDSP_Length(width),
kernel5x5,
&legacyResult)
let returnedResult = vDSP.convolve(pixels,
rowCount: height, columnCount: width,
with5x5Kernel: kernel5x5)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
Accelerate_vDSPConvolutionTests.test("vDSP/DoublePrecision7x3") {
let kernel7x3 = [Double](repeating: 1.0 / (7 * 3), count: 7 * 3)
var result = [Double](repeating: .nan,
count: pixelCount)
vDSP.convolve(pixels,
rowCount: height, columnCount: width,
withKernel: kernel7x3,
kernelRowCount: 7, kernelColumnCount: 3,
result: &result)
var legacyResult = [Double](repeating: -1,
count: result.count)
vDSP_imgfirD(pixels,
vDSP_Length(height), vDSP_Length(width),
kernel7x3,
&legacyResult,
7, 3)
let returnedResult = vDSP.convolve(pixels,
rowCount: height, columnCount: width,
withKernel: kernel7x3,
kernelRowCount: 7, kernelColumnCount: 3)
expectTrue(result.elementsEqual(legacyResult))
expectTrue(result.elementsEqual(returnedResult))
}
}
runAllTests()