Skip to content

Commit f160f68

Browse files
authored
Merge pull request #11625 from apple/bnns-overlay-fix-4.0
[4.0] Fix ambiguity between overlay inits and default inits for BNNS structs.
2 parents 2870cf3 + 2ed492d commit f160f68

File tree

2 files changed

+49
-36
lines changed

2 files changed

+49
-36
lines changed

stdlib/public/SDK/Accelerate/BNNS.swift.gyb

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ extension BNNSImageStackDescriptor {
8989
channels: Int,
9090
row_stride: Int,
9191
image_stride: Int,
92-
data_type: BNNSDataType,
93-
data_scale: Float = 1,
94-
data_bias: Float = 0) {
92+
data_type: BNNSDataType) {
9593

9694
_precondition(data_type != .indexed8,
9795
"Image stacks cannot use the indexed8 data type.")
@@ -102,25 +100,23 @@ extension BNNSImageStackDescriptor {
102100
self.row_stride = row_stride
103101
self.image_stride = image_stride
104102
self.data_type = data_type
105-
self.data_scale = data_scale
106-
self.data_bias = data_bias
103+
self.data_scale = 1
104+
self.data_bias = 0
107105
}
108106
}
109107

110108
extension BNNSVectorDescriptor {
111109
${available(bnns2016)}
112110
public init(size: Int,
113-
data_type: BNNSDataType,
114-
data_scale: Float = 1,
115-
data_bias: Float = 0) {
111+
data_type: BNNSDataType) {
116112

117113
_precondition(data_type != .indexed8,
118114
"Vectors cannot use the indexed8 data type.")
119115

120116
self.size = size
121117
self.data_type = data_type
122-
self.data_scale = data_scale
123-
self.data_bias = data_bias
118+
self.data_scale = 1
119+
self.data_bias = 0
124120
}
125121
}
126122

@@ -129,25 +125,34 @@ extension BNNSLayerData {
129125
public init(data: UnsafeRawPointer?,
130126
data_type: BNNSDataType,
131127
data_scale: Float = 1,
132-
data_bias: Float = 0,
133-
data_table: UnsafePointer<Float>? = nil) {
128+
data_bias: Float = 0) {
134129

135-
if data_type == .indexed8 {
136-
_precondition(data_table != nil,
137-
"data_table cannot be nil if data_type is .indexed8.")
138-
}
130+
_precondition(data_type != .indexed8,
131+
"This initializer cannot be used with the indexed8 data type; use BNNSLayerData.indexed8 instead.")
139132

140133
self.data = data
141134
self.data_type = data_type
142135
self.data_scale = data_scale
143136
self.data_bias = data_bias
144-
self.data_table = data_table
137+
self.data_table = nil
145138
}
146139

147140
${available(bnns2016)}
148141
public static var zero: BNNSLayerData {
149142
return BNNSLayerData()
150143
}
144+
145+
/// A BNNSLayerData object with the indexed8 data type.
146+
${available(bnns2016)}
147+
public static func indexed8(data: UnsafePointer<Int8>?,
148+
data_table: UnsafePointer<Float>)
149+
-> BNNSLayerData {
150+
return BNNSLayerData(data: data,
151+
data_type: .indexed8,
152+
data_scale: 1, // unused
153+
data_bias: 0, // unused
154+
data_table: data_table)
155+
}
151156
}
152157

153158
extension BNNSActivation {
@@ -231,9 +236,7 @@ extension BNNSConvolutionLayerParameters {
231236
k_height: Int,
232237
in_channels: Int,
233238
out_channels: Int,
234-
weights: BNNSLayerData,
235-
bias: BNNSLayerData = .zero,
236-
activation: BNNSActivation = .identity) {
239+
weights: BNNSLayerData) {
237240
self.x_stride = x_stride
238241
self.y_stride = y_stride
239242
self.x_padding = x_padding
@@ -243,8 +246,8 @@ extension BNNSConvolutionLayerParameters {
243246
self.in_channels = in_channels
244247
self.out_channels = out_channels
245248
self.weights = weights
246-
self.bias = bias
247-
self.activation = activation
249+
self.bias = .zero
250+
self.activation = .identity
248251
}
249252
}
250253

@@ -258,9 +261,7 @@ extension BNNSPoolingLayerParameters {
258261
k_height: Int,
259262
in_channels: Int,
260263
out_channels: Int,
261-
pooling_function: BNNSPoolingFunction,
262-
bias: BNNSLayerData = .zero,
263-
activation: BNNSActivation = .identity) {
264+
pooling_function: BNNSPoolingFunction) {
264265
self.x_stride = x_stride
265266
self.y_stride = y_stride
266267
self.x_padding = x_padding
@@ -270,22 +271,20 @@ extension BNNSPoolingLayerParameters {
270271
self.in_channels = in_channels
271272
self.out_channels = out_channels
272273
self.pooling_function = pooling_function
273-
self.bias = bias
274-
self.activation = activation
274+
self.bias = .zero
275+
self.activation = .identity
275276
}
276277
}
277278

278279
extension BNNSFullyConnectedLayerParameters {
279280
${available(bnns2016)}
280281
public init(in_size: Int,
281282
out_size: Int,
282-
weights: BNNSLayerData,
283-
bias: BNNSLayerData = .zero,
284-
activation: BNNSActivation = .identity) {
283+
weights: BNNSLayerData) {
285284
self.in_size = in_size
286285
self.out_size = out_size
287286
self.weights = weights
288-
self.bias = bias
289-
self.activation = activation
287+
self.bias = .zero
288+
self.activation = .identity
290289
}
291290
}

test/stdlib/Accelerate.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@ import Accelerate
99

1010
var AccelerateTests = TestSuite("Accelerate")
1111

12-
if #available(iOS 10.0, OSX 10.12, tvOS 10.0, *) {
12+
if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 4.0, *) {
1313

1414
AccelerateTests.test("BNNS/ImageStackDescriptor") {
15-
let succeed = BNNSImageStackDescriptor(width: 0, height: 0, channels: 0,
15+
var succeed = BNNSImageStackDescriptor(width: 0, height: 0, channels: 0,
1616
row_stride: 0, image_stride: 0,
1717
data_type: .int8)
1818
expectEqual(succeed.data_scale, 1)
1919
expectEqual(succeed.data_bias, 0)
20+
succeed = BNNSImageStackDescriptor(width: 0, height: 0, channels: 0,
21+
row_stride: 0, image_stride: 0,
22+
data_type: .int16,
23+
data_scale: 0.5, data_bias: 0.5)
24+
expectEqual(succeed.data_scale, 0.5)
25+
expectEqual(succeed.data_bias, 0.5)
2026
expectCrashLater()
2127
// indexed8 is not allowed as an imageStack data type.
2228
let _ = BNNSImageStackDescriptor(width: 0, height: 0, channels: 0,
@@ -25,9 +31,13 @@ if #available(iOS 10.0, OSX 10.12, tvOS 10.0, *) {
2531
}
2632

2733
AccelerateTests.test("BNNS/VectorDescriptor") {
28-
let succeed = BNNSVectorDescriptor(size: 0, data_type: .int8)
34+
var succeed = BNNSVectorDescriptor(size: 0, data_type: .int8)
2935
expectEqual(succeed.data_scale, 1)
3036
expectEqual(succeed.data_bias, 0)
37+
succeed = BNNSVectorDescriptor(size: 0, data_type: .int8,
38+
data_scale: 0.5, data_bias: 0.5)
39+
expectEqual(succeed.data_scale, 0.5)
40+
expectEqual(succeed.data_bias, 0.5)
3141
expectCrashLater()
3242
// indexed8 is not allowed as a vector data type.
3343
let _ = BNNSVectorDescriptor(size: 0, data_type: .indexed8)
@@ -39,8 +49,12 @@ if #available(iOS 10.0, OSX 10.12, tvOS 10.0, *) {
3949
var succeed = BNNSLayerData(data: nil, data_type: .int8)
4050
expectEqual(succeed.data_scale, 1)
4151
expectEqual(succeed.data_bias, 0)
52+
succeed = BNNSLayerData(data: nil, data_type: .int8, data_scale: 0.5,
53+
data_bias: 0.5, data_table: nil)
54+
expectEqual(succeed.data_scale, 0.5)
55+
expectEqual(succeed.data_bias, 0.5)
4256
var table: [Float] = [1.0]
43-
succeed = BNNSLayerData(data: nil, data_type: .indexed8, data_table: &table)
57+
succeed = BNNSLayerData.indexed8(data: nil, data_table: &table)
4458
expectCrashLater()
4559
// indexed8 requires a non-nil data table.
4660
let _ = BNNSLayerData(data: nil, data_type: .indexed8)

0 commit comments

Comments
 (0)