朱莉婭是一種高性能編程語言,內置了許多有用的數值分析工具。 它易於編寫,並且擁有快速增長的有用軟件包生態系統,可用於科學計算、機器學習等。 與 JMP 一樣,Julia 是科學家、研究人員和工程師的寶貴工具。
Julia 以易於與其他編程語言互操作而聞名,我很好奇從 JSL 調用 Julia 會有多難。 如果可以做到(可以!), 我看到從 JSL 調用 Julia 的潛力很大。 您可以構建調用高性能 Julia 程序的交互式 JMP 用戶界面。 您可以在 Julia 中構建模型並在 JMP 中繪製結果,反之亦然。 您可以將 JMP 工作流程的緩慢部分放在 Julia 中進行。
我將討論從 JSL 調用 Julia 的兩種方法。 第一種方法使用JSL調用Python調用Julia。 在第二種方法中,我們將 Julia 嵌入到用 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 和 JMP 16.1。
假設 Python 安裝正常,設置如下:
如果您還沒有安裝 Julia。 有關說明,請訪問官方二進製文件的平台特定說明. 最新版本的下載可在朱莉婭下載頁面.
接下來,按照指示安裝 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 提交運行任何 Julia 代碼。
// 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 在 Big Class.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>
實際與預測的 Graph Builder 圖,其結果在 Julia 中計算

將 Julia 嵌入到 DLL 中
也可以嵌入朱莉婭在 C 代碼中。 我將分享一些簡單的例子,但我相信更熟悉 C 的人可以更進一步。
加載DLL
這裡的關鍵是 JSL 的加載DLL功能。 學習如何使用的一個很好的資源加載DLL是這張紙. 作為一個簡單的例子,我們可以在一個名為 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是一個環境變量,其中包含您的 julia 二進製文件的路徑。 對我來說,這是 /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
現在我們可以調用正弦度在 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 和加載DLL接口允許我們超越 JMP 並調用 Julia。 它需要一些試驗和錯誤才能使其正常工作,但是一旦設置好,它就可以很好地工作。 我在這篇文章中展示了一些簡單的示例,但我看到了結合 JMP 和 Julia 構建新的有趣應用程序的潛力。
謝謝閱讀。 我希望我讓您了解並好奇探索。
版本說明
我只能讓 Julia 在 Mac 上使用 Julia 1.5 和 Julia 1.8 beta 通過 Python 工作。 我在 Windows 上通過 Python 使用 Julia 沒有成功,但我沒有嘗試在 Mac 上那麼多版本。 我使用 JMP 16 進行所有測試。