This project is maintained by ohara-lab-su
この文書は、実験 X 線散乱データを PDF へ変換する Python I/F について、
localPDF.LocalPDF と rust_pdf.RustPDF の対応だけをまとめる。
数値実装を同一化する文書ではない。 同じ物理操作・同じ物理量だけ公開名を揃える。
localPDF:
from localPDF import Config
from localPDF import LocalPDF
config = Config("config.json")
pdf = LocalPDF(config=config)
pdf.load_xy("data.dat")
pdf.run_all()
pdf.run_bft()
RustPDF:
from rust_pdf import Config
from rust_pdf import RustPDF
config = Config("config.json")
pdf = RustPDF(config=config)
pdf.load_xy("data.dat")
pdf.run_all()
Rust は pipeline 一回で bFT/Lorch まで生成するため、
localPDF の run_bft() に相当する別計算を追加しない。
get_iq() raw i(Q)
get_sq() S(Q) = i(Q) + 1
get_gr() reduced PDF G(r)
get_gr_lorch() Lorch G(r)
get_ggr() pair distribution g(r)
get_ggr_lorch() Lorch g(r)
get_gr() を g(r) の意味にはしない。
webPDF の _Gr が G(r)、_ggr が g(r) であることを基準にする。
localPDF の Config は webPDF JSON を Python object 化する。
RustPDF の Config はそれに加えて Rust optimizer の parameter tree を保持する。 Rust の fit-enabled scalar:
{
"value": 0.55,
"constraint": {
"min": 0.4,
"max": 0.8
}
}
を平坦化しない。
この差は Rust optimizer を利用するために必要な差であり、 同じ物理 parameter の property 名は可能な範囲で揃える。
localPDF に対応機能がないため、optimizer は RustPDF 固有 API とする。
pdf.optimize()
pdf.run_all()
または
pdf.quick_optimize()
pdf.run_all()
通常 optimize と quick optimize の差は Rust optimize.rs に由来する。
通常 optimize:
quick optimize:
どちらも最適化済み parameters を返す。
高レベル RustPDF はその parameter tree を自身の Config に反映する。
高レベル I/F と独立して以下を維持する。
version()
run()
optimize()
quick_optimize()
to_gr()
to_tr()
to_rdf()
to_nr()
run_result(), optimize_result(), quick_optimize_result() も残す。
したがって利用者は、
状態を持つ RustPDF を使うことも、
従来どおり関数を直接呼ぶこともできる。
この I/F 整理では以下の意味を変更しない。
pipeline::run()optimize::run()optimize::quick_run()run_all() / run_bft() 内部手順共通 I/F は package root から公開するが、実装責務は分離する。
__init__.py -> re-export
api.py -> low-level Rust binding wrapper
config.py -> Config
result.py -> result object / derived physical quantities
pdf.py -> stateful RustPDF
この分割は公開 I/F の変更ではない。
参照 main_local.py と同じ呼び出し順:
pdf.load_xy(xy_file)
if bg_file is not None:
pdf.load_bg_xy(bg_file, factor=bg_factor)
pdf.run_all()
pdf.run_bft()
を RustPDF でも使用できる。
Rust の run_bft() は数値処理を再実行しない。
Rust pipeline は run_all() で BFT/Lorch まで生成済みだからである。
旧 low-level API:
opt = rust_pdf.optimize(config, tth, intensity, bg_tth, bg_intensity)
out = rust_pdf.run(opt["parameters"], tth, intensity, bg_tth, bg_intensity)
に対応する高レベル自動 API:
pdf.run_auto()
quick 版:
pdf.run_auto(quick=True)
自動版は optimizer と PDF pipeline の既存処理を順番に呼ぶ。
共通化はメソッド名ではなく、機能・処理・物理的意味で判定する。
pdf.run_all()
pdf.run_bft()
run_all() は raw PDF までの複数段階をまとめた実処理。
run_bft() は BFT_smooth() という後段の実処理。
pdf.run()
Rust native run() に対応する通常 pipeline。
Rust pipeline 内で raw/BFT/Lorch まで計算する。
Rust には localPDF run_bft() と同じ独立した後段処理がないため、
RustPDF に run_bft() は設けない。
optimizer は通常 pipeline とは分離する。
pdf.optimize()
pdf.run()
または、
pdf.quick_optimize()
pdf.run()
run_auto() は設けない。
get_gr() の G(r)、get_ggr() の g(r) など、
物理的意味が一致する結果 I/F は共通化する。
名前だけ同じで処理意味が異なる API は共通化しない。
サンプルは2本だけとする。
main_rust_manual.py
main_rust_auto.py
main_rust_manual.py は通常 pipeline を明示的に pdf.run() する手動版。
main_rust_auto.py は parameter optimization を行う自動版であり、
オリジナル Rust API の意味を保って、
pdf.optimize()
pdf.run()
と明示的に実行する。
run_auto() のような独自 API は使用しない。