forward API

forward パッケージは、双対数上の関数をある点での導関数に変換します。2 つのスカラー・フォワードモードドライバー diff と value_and_diff を含み、Dual を再エクスポートします。ルートパッケージが両方の関数を再エクスポートしているため、ほとんどのプログラムはこれらを @autodiff.diff と @autodiff.value_and_diff として呼び出します。

ソース:src/forward/forward.mbt。

インポート

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(x),f′(x))(f(x), f'(x)) になります。コストは双対数上での f の 1 回の評価です。f は引数の接成分を調べてはいけません。value() に基づく分岐も含め、f が行うことはすべて微分されます。

diff

導関数値 f′(x)f'(x) のみを返します。

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}