forward API
forward パッケージは、双対数上の関数をある点での導関数に変換します。2 つのスカラー・フォワードモードドライバー diff と value_and_diff を含み、Dual を再エクスポートします。ルートパッケージが両方の関数を再エクスポートしているため、ほとんどのプログラムはこれらを @autodiff.diff と @autodiff.value_and_diff として呼び出します。
インポート
import {
"Luna-Flow/autodiff/forward",
}
ドライバー
value_and_diff
x において f を評価し、値と 1 階導関数を返します。
pub fn[T : @luna-generic.One] value_and_diff((@dual.Dual[T]) -> @dual.Dual[T], T) -> (T, T)
f(Dual::variable(x)) を 1 回呼び出し、(y.value(), y.tangent()) を返します。dual の設計 により、f が Dual[T] の演算から構成され、それ以外の入力をすべて定数として扱う場合、この組は になります。コストは双対数上での f の 1 回の評価です。f は引数の接成分を調べてはいけません。value() に基づく分岐も含め、f が行うことはすべて微分されます。
diff
導関数値 のみを返します。
pub fn[T : @luna-generic.One] diff((@dual.Dual[T]) -> @dual.Dual[T], T) -> T
diff(f, x) は value_and_diff(f, x) の第 2 成分です。
test "scalar drivers" {
let (value, derivative) = @forward.value_and_diff(x => x * x * x, 2.0)
assert_eq(value, 8.0)
assert_eq(derivative, 12.0)
assert_eq(@forward.diff(x => x.sin(), 0.0), 1.0)
}
再エクスポートされる型
Dual
pub using @dual {type Dual} により、@forward.Dual は @dual.Dual と同じ型になります。dual API を参照してください。
pub using @dual {type Dual}