"Julia" (外部評価システム)
詳細
- Juliaバージョン0.7以降がサポートされる.ExternalFunctionのサポートには,Julia 1.2以降が必要である.
- Wolfram言語でJuliaが使えるよう設定するためには,ワークフローの「ExternalEvaluate用にJuliaを設定する」の手順に従うとよい.
ExternalEvaluateの使用法
- ExternalEvaluate["Julia",code] はJulia REPLでコード列を実行し,Wolfram言語式として結果を返す.
- ExternalEvaluate["Julia""String",code] はJulia REPLでコード列を実行し,Wolfram言語の文字列として出力を返す.
データ型
- Juliaに組み込まれた次の型がサポートされている:
-
Bool True | False ブール値True/False Int8, Int16, Int32, etc. Integer 整数 Float16, Float32, etc. Real 実数 Complex{Float16}, Complex{Float32}, etc. Complex 複素数(Juliaから返される場合のみ) String String 文字列 Array List オブジェクトのリスト Dict Association 連想の配列 Set List 重複のない非順序集合 Tuple List 固定長のコンテナ Date, DateTime ![TemplateBox[{DateObject, paclet:ref/DateObject}, RefLink, BaseStyle -> {3ColumnTableMod}] TemplateBox[{DateObject, paclet:ref/DateObject}, RefLink, BaseStyle -> {3ColumnTableMod}]](Files/Julia.ja/1.png)
日付,日付区間 NaN Indeterminate 非数値 nothing Null 戻り値なし
例題
すべて開く すべて閉じる例 (1)
ExternalEvaluate["Julia", "2+2"]ExternalEvaluate["Julia", "[1,2,3,4]"]>とタイプしてドロップダウンメニューからJuliaを選ぶと,評価にExternalEvaluateを使うコードのセルが得られる:
日付はDateObject式としてJuliaから返される:
ExternalEvaluate["Julia", "using Dates; DateTime(2022)"]スコープ (20)
ExternalEvaluate["Julia", "true || false"]ExternalEvaluate["Julia", "\"hello\" * \" \" * \"world\""]ExternalEvaluate["Julia", "Dict(\"one\"=>1, \"two\"=>2, \"three\"=>3)"]Juliaの配列はListとして返される:
ExternalEvaluate["Julia", "[1 2 3;4 5 6]"]セッションオプション (9)
"ReturnType" (3)
Julia評価システムでは,デフォルトの戻り型は"Expression"である:
ExternalEvaluate["Julia", "2+2"] === ExternalEvaluate["Julia" -> "Expression", "2+2"]"Expression"戻り型では,数,文字列,リスト,連想は自動的にインポートされる:
ExternalEvaluate["Julia", "[1, 2, 3]"]MatchQ[%, {__Integer}]"String"戻り型は,Julia関数の repr を呼び出すことによって結果の列を返す:
ExternalEvaluate["Julia" -> "String", "[1, 2, 'א']"]ExternalEvaluate["Julia", "repr([1, 2, 'א'])"]"Version" (1)
"Evaluator" (1)
"SessionProlog" (1)
"SessionEpilog" (1)
"Prolog" (1)
コマンドオプション (10)
"Command" (3)
Juliaコードの列が与えられたときだけ,コマンドは直接実行される:
ExternalEvaluate["Julia", "2+2"]ExternalEvaluate["Julia", <|"Command" -> "2+2"|>]Fileラッパーを使ってファイルのコードを実行する:
ExternalEvaluate["Julia", {
<|"Command" -> File["ExampleData/add.jl"]|>,
<|"Command" -> "add2(3)"|>
}]ExternalEvaluate["Julia", {
File["ExampleData/add.jl"],
"add2(3)"
}]CloudObjectにコードを置く:
cloudObj = CloudExport["print(\"Hello World!\")", "Text", CloudObject["hello-world-jl"]]ExternalEvaluate["Julia", <|"Command" -> cloudObj|>]ExternalEvaluate["Julia", cloudObj]"ReturnType" (1)
デフォルトでは,コマンドはセッションの生成中に指定される"ReturnType"を使って実行される:
ExternalEvaluate[
{"Julia", "ReturnType" -> "String"},
"Dict('a'=> 2)"
]コマンドで"ReturnType"を指定すると,セッションの"ReturnType"が上書きされる:
ExternalEvaluate[
{"Julia", "ReturnType" -> "String"},
{
<|"Command" -> "Dict('a'=> 2)"|>,
<|"Command" -> "Dict('a'=> 2)", "ReturnType" -> "Expression"|>
}
]"Arguments" (2)
"Arguments"を使って,引数で評価の結果を呼び出す:
ExternalEvaluate[
"Julia",
<|"Command" -> "+", "Arguments" -> {0, 5}|>
]リスト以外の引数が与えられると,関数には単独の引数が渡される:
ExternalEvaluate[
"Julia",
<|"Command" -> "repr", "Arguments" -> 1|>
]第一引数としてリストを渡す必要がある場合は,追加のリストで明示的にそれをラップしなければならない:
ExternalEvaluate[
"Julia",
{
<|"Command" -> "repr", "Arguments" -> 1|>,
<|"Command" -> "repr", "Arguments" -> {1}|>,
<|"Command" -> "repr", "Arguments" -> {{1}}|>
}
]"Command"内で関数を定義し,"Arguments"で直接それを呼び出すことができる:
ExternalEvaluate[
"Julia",
<|"Command" -> "f(a, b)= a+b", "Arguments" -> {1, 2}|>
]Ruleを使っても同じ結果を得ることができる:
ExternalEvaluate[
"Julia",
"f(a, b)= a+b" -> {1, 3}
]ExternalFunctionを生成することによって引数を渡すこともできる:
session = StartExternalSession["Julia"]function = ExternalFunction[session, "f(a, b)= a+b"]function[1, 3]DeleteObject[session]"Constants" (1)
"TemplateArguments" (3)
コマンドを実行するとき,TemplateExpressionを行内に埋め込むことができる:
x = RandomReal[]
ExternalEvaluate["Julia", "1 + <* x *>"]"TemplateArguments"を使ってTemplateSlotを明示的に埋めることができる:
ExternalEvaluate[
"Julia",
<|"Command" -> "2 + ``", "TemplateArguments" -> 1|>
]リスト以外の引数が与えられると,テンプレートには単独のテンプレート引数が渡される:
ExternalEvaluate[
"Julia",
<|"Command" -> "repr(``)", "TemplateArguments" -> 1|>
]第一引数としてリストを渡す必要がある場合,それを明示的に追加のリストでラップしなければならない:
ExternalEvaluate[
"Julia",
{
<|"Command" -> "repr(``)", "TemplateArguments" -> 1|>,
<|"Command" -> "repr(``)", "TemplateArguments" -> {1}|>,
<|"Command" -> "repr(``)", "TemplateArguments" -> {{1}}|>
}
]テンプレートスロットに名前を付け,Associationを使うと,テンプレートに名前付きの引数を渡すことができる:
ExternalEvaluate[
"Julia",
<|"Command" -> "collect(range(`start`, `length`, `end`))", "TemplateArguments" -> <|"start" -> 1, "end" -> 10, "length" -> 10|>|>
]アプリケーション (2)
JuliaのStatisticsパッケージの mean 関数を使う:
session = StartExternalSession["Julia"];
ExternalEvaluate[session, "using Pkg; Pkg.add(\"Statistics\")"];
mean = ExternalEvaluate[session, "using Statistics; mean"]mean[Range[50]]DeleteObject[session]JuliaのOrdinaryDiffEqパッケージを使って放射性崩壊問題を解く:
session = StartExternalSession["Julia"];
ExternalEvaluate[session, "using Pkg; Pkg.add(\"OrdinaryDiffEq\")"];{t, u} = ExternalEvaluate[session, "using OrdinaryDiffEq
c1 = 5.730
u0=1.0
tspan = (0.0, 1.0)
radioactivedecay(u,p,t) =-c1*u
prob = ODEProblem(radioactivedecay,u0,tspan)
sol = solve(prob,Tsit5())
[sol.t,sol.u]
"];ListLinePlot[Transpose[{t, u}],
PlotLabel -> "Carbon-14 half-life",
PlotStyle -> Red,
Epilog -> Point[Transpose[{t, u}]],
ImageSize -> 400,
Frame -> True,
FrameLabel -> {"Time in thousands of years", "Percentage left"}
]特性と関係 (2)
session = StartExternalSession["Julia"];sqrt = ExternalFunction[session, "sqrt"]sqrt[4]DeleteObject[session]NumericArrayは同じ要素タイプを持つ配列としてJuliaに送られる:
session = StartExternalSession["Julia"]juliaTypeOf = ExternalFunction[session, "typeof"];juliaTypeOf[NumericArray[Range[100], "UnsignedInteger16"]]DeleteObject[session]関連するガイド
関連するワークフロー
- ExternalEvaluate用にJuliaを設定する
履歴
2020 で導入 (12.1)