Lua から Julia を呼び出す

Lua から Julia を呼び出す

このサンプルコードは以前、Adityaによるブログ投稿、1 つの小さな調整を加えました。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 も使用しています。

2 人の異なる人が、このコードが Arch Linux 上で動作したと報告しています。そのうちの 1 人は Aditya です。

チャットから彼の言葉を引用します:

私のシステムでは、ロードする必要があるライブラリは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

関連情報