Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.

Fix ParameterlessLayer conformances. #620

Merged
merged 1 commit into from
Jul 3, 2020

Conversation

dan-zheng
Copy link
Member

Associated type inference behavior was changed in swiftlang/swift#32578:
derived conformances are now attempted before associated type inference.

This broke ParameterlessLayer, which relied on a
TangentVector == EmptyTangentVector same-type constraint to set a
default TangentVector type witness for conforming types.

Add explicit TangentVector type witnesses to
ParameterlessLayer-conforming types to fix this regression.

This workaround is forward- and backward-compatible, but makes code more
verbose.

Related tensorflow/swift-apis change: tensorflow/swift-apis#1034


Fixes build errors from the 2020-06-30 master -> tensorflow merge:

/swift-models/Models/ImageClassification/ShuffleNetV2.swift:21:15: error: 'ParameterlessLayer' requires the types 'ChannelShuffle.TangentVector' and 'EmptyTangentVector' be equivalent
public struct ChannelShuffle: ParameterlessLayer {
              ^
/swift-models/Models/ImageClassification/ShuffleNetV2.swift:21:15: note: requirement specified as 'Self.TangentVector' == 'EmptyTangentVector' [with Self = ChannelShuffle]
public struct ChannelShuffle: ParameterlessLayer {
              ^
/swift-models/Models/ImageClassification/ShuffleNetV2.swift:21:15: error: type 'ChannelShuffle.TangentVector' does not conform to protocol 'VectorProtocol'
public struct ChannelShuffle: ParameterlessLayer {
              ^
[19/147] Compiling TextModels BERTClassifier.swift
/swift-models/FastStyleTransfer/Layers/Helpers.swift:4:15: error: 'ParameterlessLayer' requires the types 'ReflectionPad2D<Scalar>.TangentVector' and 'EmptyTangentVector' be equivalent
public struct ReflectionPad2D<Scalar: TensorFlowFloatingPoint>: ParameterlessLayer {
              ^
/swift-models/FastStyleTransfer/Layers/Helpers.swift:4:15: note: requirement specified as 'Self.TangentVector' == 'EmptyTangentVector' [with Self = ReflectionPad2D<Scalar>]
public struct ReflectionPad2D<Scalar: TensorFlowFloatingPoint>: ParameterlessLayer {
              ^
/swift-models/FastStyleTransfer/Layers/Helpers.swift:4:15: error: type 'ReflectionPad2D<Scalar>.TangentVector' does not conform to protocol 'VectorProtocol'
public struct ReflectionPad2D<Scalar: TensorFlowFloatingPoint>: ParameterlessLayer {
              ^
/swift-models/FastStyleTransfer/Layers/Helpers.swift:41:15: error: 'ParameterlessLayer' requires the types 'ReLU<Scalar>.TangentVector' and 'EmptyTangentVector' be equivalent
public struct ReLU<Scalar: TensorFlowFloatingPoint>: ParameterlessLayer {
              ^
/swift-models/FastStyleTransfer/Layers/Helpers.swift:41:15: note: requirement specified as 'Self.TangentVector' == 'EmptyTangentVector' [with Self = ReLU<Scalar>]
public struct ReLU<Scalar: TensorFlowFloatingPoint>: ParameterlessLayer {
              ^
/swift-models/FastStyleTransfer/Layers/Helpers.swift:41:15: error: type 'ReLU<Scalar>.TangentVector' does not conform to protocol 'VectorProtocol'
public struct ReLU<Scalar: TensorFlowFloatingPoint>: ParameterlessLayer {
              ^
/swift-models/FastStyleTransfer/Models/TransformerNet.swift:5:15: error: type 'TransformerNet.TangentVector' does not conform to protocol 'VectorProtocol'
public struct TransformerNet: Layer {
              ^
/swift-models/FastStyleTransfer/Models/TransformerNet.swift:58:15: error: type 'ConvLayer.TangentVector' does not conform to protocol 'VectorProtocol'
public struct ConvLayer: Layer {
              ^
/swift-models/FastStyleTransfer/Models/TransformerNet.swift:90:15: error: type 'ResidualBlock.TangentVector' does not conform to protocol 'VectorProtocol'
public struct ResidualBlock: Layer {
              ^
/swift-models/FastStyleTransfer/Models/TransformerNet.swift:124:15: error: type 'UpsampleConvLayer.TangentVector' does not conform to protocol 'VectorProtocol'
public struct UpsampleConvLayer: Layer {
              ^

Associated type inference behavior was changed in
swiftlang/swift#32578:
derived conformances are now attempted before associated type inference.

This broke `ParameterlessLayer`, which relied on a
`TangentVector == EmptyTangentVector` same-type constraint to set a
default `TangentVector` type witness for conforming types.

Add explicit `TangentVector` type witnesses to
`ParameterlessLayer`-conforming types to fix this regression.

This workaround is forward- and backward-compatible, but makes code more
verbose.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant