これはGorgoniaでとても簡単な計算を行うための段階的なチュートリアルです。
私たちのゴールはGorgoniaのすべての配管を使用して簡単な操作を行うことです:
$ f(x,y) = x + y $
値は x = 2
と y = 5
x + y = z
の評価はグラフで表す事ができます:
結果を計算する為に4つのステップを使います:
x
と y
に幾つかの値を設定するz
からvalueを取り出す
*以下の方法で空の式グラフを作成します:
g := gorgonia.NewGraph()
いくつかのノードを作成しそれらを ExprGraph に関連付けます。
var x, y, z *gorgonia.Node
x
とy
はスカラー変数です。対応するノードは次のように作成できます:
x = gorgonia.NewScalar(g, gorgonia.Float64, gorgonia.WithName("x"))
y = gorgonia.NewScalar(g, gorgonia.Float64, gorgonia.WithName("y"))
関数は引数としてexprgraphを取ります; 結果のノードは自動的にグラフに関連付けられます。
次に加算演算子を作成します。この演算子は2つのノードを取り新しいノードzを返します:
if z, err = gorgonia.Add(x, y); err != nil {
log.Fatal(err)
}
戻り値のノードz
はg
がz
またはAdd
関数に渡されていない場合でもグラフには追加されます。
式 z = x + y
を表す ExprGraph ができました。ではx
とy
にいくつかの値を割り当てます。
関数 Let
を使います:
gorgonia.Let(x, 2.0)
gorgonia.Let(y, 2.5)
グラフを実行して結果を計算するには VM をインスタンス化する必要があります。 TapeMachineを使いましょう:
machine := gorgonia.NewTapeMachine(g)
defer machine.Close()
そしてグラフの実行:
if err = machine.RunAll(); err != nil {
log.Fatal(err)
}
2回目の実行が必要な場合vm
オブジェクトのReset()
メソッドを呼び出すことが必須です:
machine.Reset()
これでノードz
が結果を保持します。
Valueを抽出するにはValue()
メソッドを呼び出します:
fmt.Printf("%v", z.Value())
この場合float64
を保持するinterface{}
を返すz.Value().Data()
を呼び出して、基になる”Go”値にアクセスすることもできます。
package main
import (
"fmt"
"log"
"gorgonia.org/gorgonia"
)
func main() {
g := gorgonia.NewGraph()
var x, y, z *gorgonia.Node
var err error
// define the expression
x = gorgonia.NewScalar(g, gorgonia.Float64, gorgonia.WithName("x"))
y = gorgonia.NewScalar(g, gorgonia.Float64, gorgonia.WithName("y"))
if z, err = gorgonia.Add(x, y); err != nil {
log.Fatal(err)
}
// create a VM to run the program on
machine := gorgonia.NewTapeMachine(g)
defer machine.Close()
// set initial values then run
gorgonia.Let(x, 2.0)
gorgonia.Let(y, 2.5)
if err = machine.RunAll(); err != nil {
log.Fatal(err)
}
fmt.Printf("%v", z.Value())
}
$ go run main.go
4.5