Skip to content

Instantly share code, notes, and snippets.

@rxwei
Created February 18, 2019 13:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rxwei/1db3353f1ec425264a4e53ac45f1aefa to your computer and use it in GitHub Desktop.
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 :(
// 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