Created
February 18, 2019 13:37
-
-
Save rxwei/1db3353f1ec425264a4e53ac45f1aefa to your computer and use it in GitHub Desktop.
AnyDerivative implemented using a class. It's not possible because class computed properties cannot return Self :(
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Type-erased box. | |
fileprivate class AnyDerivativeBox : Differentiable & AdditiveArithmetic { | |
public typealias TangentVector = AnyDerivativeBox | |
public typealias CotangentVector = AnyDerivativeBox | |
public typealias AllDifferentiableVariables = AnyDerivativeBox | |
public static func == (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> Bool { | |
fatalError("Must override") | |
} | |
public static var zero: Self { | |
fatalError("Must override") | |
} | |
public static func + (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> Self { | |
fatalError("Must override") | |
} | |
public static func += (lhs: inout AnyDerivativeBox, rhs: AnyDerivativeBox) { | |
fatalError("Must override") | |
} | |
public static func - (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> Self { | |
fatalError("Must override") | |
} | |
public static func -= (lhs: inout AnyDerivativeBox, rhs: AnyDerivativeBox) { | |
fatalError("Must override") | |
} | |
public var allDifferentiableVariables: AnyDerivativeBox { | |
get { | |
fatalError("Must override") | |
} | |
set { | |
fatalError("Must override") | |
} | |
} | |
func moved(along direction: TangentVector) -> Self { | |
fatalError("Must override") | |
} | |
func tangentVector(from direction: CotangentVector) -> TangentVector { | |
fatalError("Must override") | |
} | |
} | |
/* | |
fileprivate class ConcreteDerivativeBox<Derivative : Differentiable & AdditiveArithmetic> : AnyDerivative { | |
private var wrapped: Derivative | |
public class func + (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> Self { | |
precondition(type(of: lhs) == type(of: rhs), "Type mismatch") | |
} | |
public class func - (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> Self { | |
precondition(type(of: lhs) == type(of: rhs), "Type mismatch") | |
} | |
public var allDifferentiableVariables: AnyDerivative { | |
get { | |
fatalError("Must override") | |
} | |
} | |
func moved(along direction: TangentVector) -> AnyDerivative { | |
fatalError("Must override") | |
} | |
func tangentVector(from direction: CotangentVector) -> TangentVector { | |
fatalError("Must override") | |
} | |
} | |
// Concrete box. | |
fileprivate func makeAnyDerivativeBox<T : Differentiable & AdditiveArithmetic>(_ value: T) -> AnyDerivativeBox { | |
return ConcreteDerivativeBox(value) | |
} | |
*/ | |
/* | |
// Erasure type. | |
public struct AnyDerivative : Differentiable { | |
private let box: AnyDerivativeBox | |
public typealias TangentVector = AnyDerivative | |
public typealias CotangentVector = AnyDerivative | |
public typealias AllDifferentiableVariables = AnyDerivative | |
public func + (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> AnyDerivativeBox { | |
} | |
public func - (lhs: AnyDerivativeBox, rhs: AnyDerivativeBox) -> AnyDerivativeBox { | |
} | |
public var allDifferentiableVariables: AnyDerivative { | |
get { | |
fatalError("Must override") | |
} | |
} | |
func moved(along direction: TangentVector) -> AnyDerivative { | |
fatalError("Must override") | |
} | |
func tangentVector(from direction: CotangentVector) -> TangentVector { | |
fatalError("Must override") | |
} | |
} | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment