從 Lua 呼叫 Julia

從 Lua 呼叫 Julia

此範例程式碼之前出現在Aditya 發表的博客,稍作調整。我嘗試在 Debian 10 (buster) 上運行它,但失敗並出現以下錯誤。

texlua julia.lua
ERROR: could not load library "/usr/lib/x86_64-linux-gnu/../bin/../lib/x86_64-linux-gnu/julia/sys.so"
/usr/lib/x86_64-linux-gnu/../bin/../lib/x86_64-linux-gnu/julia/sys.so: cannot open shared object file: No such file or directory

我使用預設的 Julia 版本1.0.3+dfsg-4以及目前的不穩定版本進行了嘗試1.1.1+dfsg-1。在這兩種情況下都會產生上面所示的錯誤。我還使用 Debian不穩定版(Debian 10/buster 只有預發行版)的 TeX Live 2019 向後移植版本,以及 LuaTeX 1.10.0。

兩個不同的人報告說這段程式碼在 Arch Linux 上為他們工作。阿迪亞就是其中之一。

引用他的聊天記錄:

在我的系統上,應該載入的函式庫是 libjulia.so,位於 /usr/lib/libjulia.so

在我的 Debian 系統上,julia/sys.so已安裝,但我不知道為什麼沒有找到它。

dlocate julia/sys.so
libjulia1: /usr/lib/x86_64-linux-gnu/julia/sys.so

代碼如下。

local ffi = require("ffi")
local JULIA = ffi.load("julia", true)

ffi.cdef [[
void jl_init__threading(void);
typedef struct _jl_value_t jl_value_t;
jl_value_t *jl_eval_string(const char*);
]]

JULIA.jl_init__threading()

code = [[
x = [1 2 3]'
A = [1 0 1; 0 1 1; 1 1 0]

y = x'*A*x

print(y[1])
]]

JULIA.jl_eval_string(code)

答案1

為了發揮作用,Julia 需要係統運作時sys.jl。 Julia 解釋器附帶了該運行時的預編譯版本,該版本被轉儲到sys.so.我認為設定環境變數會以某種方式影響路徑的分辨率sys.so,但我無法找出如何影響。另一個選擇是jl_init使用 將該函數指向系統映像的路徑jl_init_with_image

local ffi = require("ffi")
local JULIA = ffi.load("julia", true)

ffi.cdef [[
void jl_init_with_image__threading(const char *julia_bindir,
                                   const char *image_relative_path);
typedef struct _jl_value_t jl_value_t;
jl_value_t *jl_eval_string(const char*);
]]

JULIA.jl_init_with_image__threading("/usr/lib/x86_64-linux-gnu/julia/", "sys.so")

code = [[
x = [1 2 3]'
A = [1 0 1; 0 1 1; 1 1 0]

y = x'*A*x

print(y[1])
]]

JULIA.jl_eval_string(code)

我將此文件保存為/tmp/julia/test.lua並使用以下命令在 Docker 容器中運行:

user@host:~$ sudo docker run -v /usr/local/texlive/2019/:/usr/local/texlive/2019/:ro -v /tmp/julia/:/tmp/julia/ -it --rm debian:buster
root@9903c6e0ca52:/# export PATH=/usr/local/texlive/2019/bin/x86_64-linux/:$PATH
root@9903c6e0ca52:/# apt-get update
[...]
root@9903c6e0ca52:/# apt-get install --no-install-recommends julia libjulia-dev
[...]
root@9903c6e0ca52:/# texlua /tmp/julia/test.lua
23root@9903c6e0ca52:/#

23最後一行之前是root@9903c6e0ca52Julia 的輸出。這與我從互動式 Julia 會話中得到的結果相同:

julia> x = [1 2 3]'
3×1 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 1
 2
 3

julia> A = [1 0 1; 0 1 1; 1 1 0]
3×3 Array{Int64,2}:
 1  0  1
 0  1  1
 1  1  0

julia> y = x'*A*x
1×1 Array{Int64,2}:
 23

julia> print(y[1])
23

相關內容