🔖

nutpie の R 版こんな感じでつくれそう、というメモ

2024/11/06に公開

nutpie は PyMC でも Stan でも書けるけど、Stan の方だけなら R でもできたりしないかな?と思って調べてみた(ので、誰か作ってください)

README の Usage with Stan というところを見ると、 bridgestan という Python モジュールを使ってるっぽい。

https://github.com/pymc-devs/nutpie?tab=readme-ov-file#usage-with-stan

bridgestan というのはこれで、Stan モデルのメソッドにアクセスできるというものらしい。
Python だけでなく、R、Julia、Rust の binding がある。nutpie は Python パッケージを使ってたけど、Rust 版を使った方が受け渡しが Rust 内で完結してよさそうな感じもするけどどうなんだろう。

https://roualdes.github.io/bridgestan/latest/languages/r.html

https://roualdes.github.io/bridgestan/latest/languages/rust.html

さて、README の例に戻って、こういう感じなので、関数を3つ実装できればとりあえず動きそう。

compiled = nutpie.compile_stan_model(code=code)
compiled = compiled.with_data(mu=3.)
trace = nutpie.sample(compiled)

compile_stan_model()

これは基本的には bridgestan の compile_model() を呼び出してるだけっぽい。結果は CompiledStanModel というクラスのオブジェクトになっている。

https://github.com/pymc-devs/nutpie/blob/a657795ea7b970ba4829a3a5e3470787b011c410/python/nutpie/compile_stan.py#L162-L167

with_data()

ここは上記のオブジェクトのパラメータを書き換えたコピーを作っているだけ。

nutpie.sample()

このあたり。

https://github.com/pymc-devs/nutpie/blob/a657795ea7b970ba4829a3a5e3470787b011c410/python/nutpie/sample.py#L490

_BackgroundSampler をつくるときに、CompiledStanModel._make_sampler() が呼ばれている。それはこのあたり。

https://github.com/pymc-devs/nutpie/blob/a657795ea7b970ba4829a3a5e3470787b011c410/python/nutpie/compile_stan.py#L83-L90

この PySampler.from_stan() は Rust にある関数。

https://github.com/pymc-devs/nutpie/blob/a657795ea7b970ba4829a3a5e3470787b011c410/python/nutpie/compile_stan.py#L83-L90

https://github.com/pymc-devs/nutpie/blob/a657795ea7b970ba4829a3a5e3470787b011c410/src/wrapper.rs#L532-L550

Model は、bridgestan の Model をラップして nuts-rs の Model trait を実装しないといけない。

https://github.com/pymc-devs/nutpie/blob/a657795ea7b970ba4829a3a5e3470787b011c410/src/stan.rs#L66-L71

というか、たぶんこの辺のラッパーは似たようなものを実装しないといけないので、思ったよりコードを書く必要がありそう。

https://github.com/pymc-devs/nutpie/blob/main/src/stan.rs

Discussion