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. 두 경우 모두 위에 표시된 오류가 발생했습니다. 또한 LuaTeX 1.10.0과 함께 Debian Unstable(Debian 10/buster에는 사전 릴리스가 있음)의 TeX Live 2019 백포트를 사용하고 있습니다.

두 명의 다른 사람들이 이 코드가 Arch Linux에서 작동한다고 보고했습니다. 그 중 하나가 아디트야(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:/#

마지막 줄의 이전은 Julia의 출력 입니다 23. root@9903c6e0ca52이는 대화형 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

관련 정보