朱莉娅是一种高性能编程语言,内置了许多有用的数值分析工具。 它易于编写,并且拥有快速增长的有用软件包生态系统,可用于科学计算、机器学习等。 与 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 进行所有测试。