34 {
35 std::vector<std::string> paths;
38 if (const char *e = std::getenv("RGPOT_METATOMIC_ENGINE"))
39 if (e && *e)
40 paths.emplace_back(e);
41 if (const char *e = std::getenv("METATOMIC_ENGINE"))
42 if (e && *e)
43 paths.emplace_back(e);
44 paths.emplace_back("libmetatomic_engine.so");
45 auto add_dirs = [&](const char *env) {
46 if (!env)
47 return;
48 std::string s(env);
49 size_t i = 0;
50 while (i < s.size()) {
51 auto j = s.find(':', i);
52 if (j == std::string::npos)
53 j = s.size();
54 if (j > i) {
55 std::string d = s.substr(i, j - i);
56 if (!d.empty() && d.back() != '/')
57 d += '/';
58 paths.push_back(d + "libmetatomic_engine.so");
59 }
60 i = j + 1;
61 }
62 };
63 add_dirs(std::getenv("EON_POTENTIALS_PATH"));
64 add_dirs(std::getenv("RGPOT_ENGINE_PATH"));
65
66 std::string last_dlerr;
67 for (const auto &p : paths) {
68 m_lib = open_lib(p.c_str());
70 break;
71#ifndef _WIN32
72 if (const char *e = dlerror())
73 last_dlerr = e;
74#endif
75 }
77 std::string msg = "RGPOT(metatomic): libmetatomic_engine.so not found "
78 "(set RGPOT_METATOMIC_ENGINE or EON_POTENTIALS_PATH)";
79 if (!last_dlerr.empty())
80 msg += std::string("; last dlerror: ") + last_dlerr;
81 throw std::runtime_error(msg);
82 }
83
84 auto abi =
85 reinterpret_cast<int (*)()
>(load_sym(
m_lib,
"rgpot_mta_abi_version"));
94 throw std::runtime_error("RGPOT(metatomic): engine C ABI missing/mismatch");
95 }
96 char err[1024]{};
109 throw std::runtime_error(std::string("RGPOT(metatomic): create failed: ") +
110 err);
111 }
112}
const char * extensions_directory
double uncertainty_threshold
int torch_determinism_strict
0=Fast, 1=Strict