【问题标题】:How is the pullback defined for a function with an optional argument?如何为带有可选参数的函数定义回调?
【发布时间】:2021-07-02 19:06:57
【问题描述】:

这是一个最小的例子:

import _Differentiation

@differentiable(reverse)
func g(x: Double?) -> Double {
    if x == nil {
        return 0.0  // I don't care what this value is
    }
    else {
        return x! * x!
    }
}

@derivative(of: g)
func gVJP(x: Double?) -> (value: Double, pullback: (Double) -> Double?) {
    let value = g(x: x)
    
    func pullback(_ dOutput: Double) -> Double? {
        if x == nil {
            return nil // I don't care what this value is
        }
        else {
            return dOutput * 2.0 * x!
        }
    }
    
    return (value: value, pullback: pullback)
}

我收到以下编译器错误:

Function result's 'pullback' type does not match 'g(x:)'
1. 'pullback' does not have expected type '(Double.TangentVector) -> Optional<Double>.TangentVector' (aka '(Double) -> Optional<Double>.TangentVector')

我尝试将回调的返回类型定义为 Optional&lt;Double&gt;.TangentVector,但这给了我错误,即我的回调的返回值为 incompatible with return type 'Optional&lt;Double&gt;.TangentVector'

【问题讨论】:

  • @derivative(of: ) 是如何定义的?
  • 函数本身是正确的。我看起来你正在使用的包装器可能需要其他东西
  • @SeaSpell 请看下面的答案。

标签: swift swift5 autodiff


【解决方案1】:

pullback的返回值需要强制转换为Optional&lt;Double&gt;.TangentVector类型:

import _Differentiation

@differentiable(reverse)
func g(x: Double?) -> Double {
    if x == nil {
        return 0.0  // I don't care what this value is
    }
    else {
        return x! * x!
    }
}

@derivative(of: g)
func gVJP(x: Double?) -> (value: Double, pullback: (Double) -> Optional<Double>.TangentVector) {
    let value = g(x: x)

    func pullback(_ dOutput: Double) ->Optional<Double>.TangentVector {
        if x == nil {
            return Optional<Double>.TangentVector(nil) // I don't care what this value is
        }
        else {
            return Optional<Double>.TangentVector(dOutput * 2.0 * x!)
        }
    }

    return (value: value, pullback: pullback)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多