繁体   English   中英

Swift AutoDiff:我们如何使结构具有一个成员变量,该成员变量是具有多个参数的可微函数?

[英]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 privateprivate访问控制来实现:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM