[英]Swift AutoDiff: How do we make a struct have a member variable that is a differentiable function of more than one parameter?
我想要以下内容:
import _Differentiation
struct S {
var f: @differentiable(reverse) (Double, Double) -> Double
}
但编译器抱怨Error: Abort trap: 6
并且堆栈跟踪的开始是
Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file Casting.h, line 269.
如果成员变量是一个参数的函数,则程序构建:
import _Differentiation
struct S {
var f: @differentiable(reverse) (Double) -> Double
}
但不允许使用两个或多个参数。
我们可以写一个函数,它有两个参数的可微函数作为参数:
import _Differentiation
func g(f: @differentiable(reverse) (Double, Double) -> Double) {
// function body
}
如果函数可以有这种类型的参数,为什么结构不能有这种类型的成员变量?
这可以通过使结构和/或成员变量函数具有fileprivate
private
或private
访问控制来实现:
import _Differentiation
struct S {
fileprivate var f: @differentiable(reverse) (Double, Double, Double) -> Double
}
要么
import _Differentiation
fileprivate struct S {
public var f: @differentiable(reverse) (Double, Double, Double) -> Double
}
请注意,在第二个示例中, f
可以是public
因为S
至少被限制为fileprivate
。
解决方法是使f
成为另一个可微数据结构的函数,例如:
import _Differentiation
struct S {
struct Tuple: Differentiable {
var x: Double
var y: Double
@differentiable(reverse)
init(x: Double, y: Double) {
self.x = x
self.y = y
}
}
var f: @differentiable(reverse) (Tuple) -> Double
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.