ジュリアは、多くの便利な数値解析ツールが組み込まれた高性能プログラミング言語です。 書くのは簡単で、科学計算、機械学習などに役立つパッケージのエコシステムが急速に成長しています。 Juliaは、JMPと同様に、科学者、研究者、エンジニアにとって非常に貴重なツールです。
Juliaは、他のプログラミング言語との相互運用が容易であるという評判があり、JSLからJuliaを呼び出すのがどれほど難しいか興味がありました。 それができれば(できます!)、 JSLからジュリアに電話することには多くの可能性があります。 高性能のJuliaプログラムを呼び出すインタラクティブなJMPユーザーインターフェイスを構築できます。 Juliaでモデルを作成し、JMPで結果をプロットするか、その逆を行うことができます。 JMPワークフローの遅い部分を取り上げて、Juliaで実行することができます。
JSLからJuliaを呼び出す2つの方法について説明します。 最初のメソッドは、JSLを使用してPythonを呼び出し、Juliaを呼び出します。 2番目の方法では、Cで記述されたダイナミックリンクライブラリ(DLL)にJuliaを埋め込みます。
Juliaでのプログラミングについてはあまり取り上げないことに注意してください。 ジュリアについてもっと知りたい場合は、彼らをチェックしてくださいドキュメンテーション。 から利用できる学習資料もありますジュリアアカデミー。
Pythonを介してJuliaを呼び出す
JSLのPython
JMP 14は、Pythonと直接インターフェースするためのJSLコマンドを追加しました。 スクリプトインデックスの簡単な例を次に示します。
// Initialize the Python interface
PythonInit();
// Submit some Python code to run as a JSL string
PythonSubmit("\[message = 'The quick brown fox jumps over the lazy dog']\");
// message is now a variable in Python and can be accessed from JSL with PythonGet()
getStr = PythonGet(message);
Show(getStr);
// Terminate the Python interface
PythonTerm();
PyJulia
PythonからJuliaを呼び出すことができれば、JSLからJuliaを呼び出すことができます。 PyJuliaは、まさにそれを可能にするPythonパッケージです。 セットアップしましょう。 注:MacでJulia 1.5.4、Python 3.9.5、PyJulia 0.5.7、およびJMP16.1を使用することに成功しました。
Pythonが機能していると仮定すると、セットアップは次のようになります。
まだインストールしていない場合は、Juliaをインストールします。 手順については、次のWebサイトをご覧ください。公式バイナリのプラットフォーム固有の手順。 最新バージョンのダウンロードは、ジュリアダウンロードページ。
次に、指示PyJuliaをインストールします。
PyJuliaを使用できる場合使用方法通常のPythonセッションでは、準備は完了です。
JSLのPyJulia
JSLでは、最初にPythonセッションでJuliaを初期化する必要があります。 以下のように、実行時キーワード引数としてJulia実行可能ファイルへのパスを必ず渡してください。
Python Init();
// Initialize julia
Python Submit(
"\[
from julia import Julia
Julia(runtime="/usr/local/bin/julia")
]\");
ここから、あなたは使用することができますPython送信ユリウスコードを実行します。
// Import the main module. This is Julia's workspace.
Python Submit("\[
from julia import Main
Main.xs = [1,2,3] # xs belongs to julia
sines = Main.eval("sin.(xs)") # This returns the sine of each element in xs
]\");
show(PythonGet(sines)); // [0.841470984807897 0.909297426825682 0.141120008059867]
他のJuliaパッケージがインストールされている場合は、Pythonインポートでそれらにアクセスできます。 ここでは、Pandas.jl、DataFrames.jl、およびLasso.jlを使用して、BigClass.jmpの高さに合わせた投げ縄を実行しました。 それから私は使用しますJMP実際と予測をプロットするグラフビルダー。
// Convert datatable to julia dataframe
// Must convert it to a julia Pandas dataframe first
dt = open("$SAMPLE_DATA/Big Class.jmp");
Pythonsend(dt);
Python Submit(
"\[
from julia import Pandas
from julia import DataFrames
from julia import Lasso
Main.dt = dt
predicted = Main.eval("""
using Lasso
df = DataFrames.DataFrame(Pandas.DataFrame(dt))
m = fit(LassoModel, @formula(height ~ sex + weight), df)
predict(m, df)
""")
]\");
// Back to JMP where we plot Actual vs. Predicted
predicted = pythonget("predicted");
dt << newColumn("Predicted height", <<SETVALUES></SETVALUES>
Juliaで計算された結果を使用した実際のグラフビルダーと予測されたグラフビルダーのプロット

ジュリアをDLLに埋め込む
することも可能ですジュリアを埋め込むCコードで。 ささいな例をいくつか紹介しますが、Cに精通している人ならこれをさらに進めることができると確信しています。
LoadDLL
ここで重要なのはJSLですLoadDLL働き。 使用方法を学ぶための優れたリソースLoadDLLはこの紙。 簡単な例として、test.cというファイルで次のC関数を使用できます。
// test.c
double myMultiply(double num1, double num2)
{
return num1 * num2;
}
そしてDLLにコンパイルします
# On Mac
gcc -shared -o test.dylib test.c
# On Windows
gcc -shared -o test.dll test.c
次に、JMPでは、C関数を呼び出すことができます
dll = loadDLL(convertfilepath("/path/to/my/test.dylib"));
dll << declareFunction("myMultiply",
Convention( STDCALL ),
Arg(Double, "num1"),
Arg(Double, "num2"),
Returns( Double )
);
show(dll << myMultiply(Pi(), 100));
dll << unloadDLL;
ジュリアDLL
次に、Juliaが埋め込まれたDLLを見てみましょう。 入力の正弦を計算する関数を作成します。ここで、入力は度単位です。
// call_julia.c
#include <julia.h>
double sineInDegrees(double degrees)
{
// required: setup the Julia context
jl_init();
// You can evaluate Julia code from strings
jl_value_t *factor = jl_eval_string("pi/180");
double factor_unboxed = jl_unbox_float64(factor);
double radians = degrees * factor_unboxed;
// You can call Julia functions directly
jl_function_t *func = jl_get_function(jl_base_module, "sin");
jl_value_t *argument = jl_box_float64(radians);
jl_value_t *ret = jl_call1(func, argument);
double ret_unboxed = jl_unbox_float64(ret);
jl_atexit_hook(0);
return ret_unboxed;
}
以下を実行してMacでコンパイルします。 $ JULIA_DIRは、ジュリアバイナリへのパスを持つ環境変数です。 私にとって、これは/Applications/Julia-1.7.app/Contents/Resources/juliaでした。 私はこれをWindowsで試しませんでしたが、同様のことが機能するはずです。
# On Mac
gcc -shared -o call_julia.dylib call_julia.c -fPIC -I$JULIA_DIR/include/julia -L$JULIA_DIR/lib -Wl,-rpath,$JULIA_DIR/lib -ljulia
今、私たちは呼び出すことができますsineInDegrees JSLで!
dll = loadDLL(convertfilepath("/path/to/my/call_julia.dylib"));
dll << declareFunction("sineInDegrees",
Convention( STDCALL ),
Arg( Double, "degrees" ),
Returns( Double )
);
show(dll << sineInDegrees(90)); // 1
dll << unloadDLL;
結論
JSLのPythonとLoadDLLインターフェイスを使用すると、JMPを超えて、Juliaに電話をかけることができます。 これを機能させるには試行錯誤が必要でしたが、一度設定すると非常にうまく機能します。 この投稿ではいくつかの簡単な例を示しましたが、JMPとJuliaを組み合わせて新しく興味深いアプリケーションを構築する可能性があると思います。
読んでくれてありがとう。 私はあなたに情報を与え、探求することに興味を持ったままにしておいたと思います。
バージョンに関する注記
私はJuliaをJulia1.5とMacのJulia1.8ベータでPythonを介して動作させることしかできませんでした。 WindowsでPythonを介してJuliaを使用することはできませんでしたが、Macほど多くのバージョンを試しませんでした。 すべてのテストにJMP16を使用しました。