Loading...
Searching...
No Matches
eonc::xtsci_eindir Namespace Reference

Classes

struct  View
 Semantic objective contract shared with eindir_objective_descriptor_t. More...

Functions

View eon_requirement ()
 What an eOn minimization may consume: eV, angstrom, analytic forces.
View rgpot_ev_angstrom ()
 rgpot producer advertising the same units and tensor contract.
bool compatible (const View &actual, const View &required)
 Nonzero when actual satisfies required. Schema id is never a wildcard.
bool abi_accepts_gradient (std::uint32_t major, std::uint32_t expected_major, std::uint64_t features)
 Major must match and the gradient feature bit must be set.
const std::string & provenance ()
 Stamp text from the last successful eindir bind. Empty when unused.
State * bind (ObjectiveFunction *objective, Eigen::VectorXd *cached)
 Borrow an ObjectiveFunction as an eindir objective.
void release (State *state)
int eval_grad (State *state, const DLManagedTensorVersioned *x, double *value, DLManagedTensorVersioned *gradient)
 One fused energy and gradient through the borrowed eindir handle.
int minimize (State *state, double *x, std::size_t n, std::size_t maxiter, double gtol, double istep, std::size_t memory, int method, double *value_out)
 xts_minimize_eindir on a caller-owned buffer. The caller keeps State.

Variables

constexpr const char * kSchemaId = "eindir.objective-descriptor.v1"
constexpr std::uint64_t kOpEnergy = 1ull << 0
constexpr std::uint64_t kOpForces = 1ull << 1
constexpr int kDeviceCpu = 1
constexpr int kDtypeFloat = 2
constexpr std::uint32_t kLayoutContiguous = 1
constexpr std::uint32_t kLifetimeBorrowed = 1
constexpr std::uint64_t kFeatureGradient = 1ull << 0

Function Documentation

◆ abi_accepts_gradient()

bool eonc::xtsci_eindir::abi_accepts_gradient ( std::uint32_t major,
std::uint32_t expected_major,
std::uint64_t features )

Major must match and the gradient feature bit must be set.

Definition at line 182 of file XtsciEindir.cpp.

183 {
184 return major == expected_major && (features & kFeatureGradient) != 0;
185}
constexpr std::uint64_t kFeatureGradient
Definition XtsciEindir.h:49

◆ bind()

State * eonc::xtsci_eindir::bind ( ObjectiveFunction * objective,
Eigen::VectorXd * cached )

Borrow an ObjectiveFunction as an eindir objective.

Null when eindir is not linked. Does not take ownership of the objective or the cache.

Definition at line 189 of file XtsciEindir.cpp.

189 {
190#ifndef WITH_EINDIR
191 (void)objective;
192 (void)cached;
193 return nullptr;
194#else
195 if (objective == nullptr || objective->degreesOfFreedom() <= 0) {
196 return nullptr;
197 }
198 auto state = std::make_unique<State>();
199 state->objective = objective;
200 state->cached = cached;
201 const auto dim = static_cast<std::size_t>(objective->degreesOfFreedom());
202 const double inf = std::numeric_limits<double>::infinity();
203 state->low.assign(dim, -inf);
204 state->high.assign(dim, inf);
205 View actual = eon_requirement();
206 actual.producer_id = "eon.objective";
207 state->schema = actual.schema_id;
208 state->producer = actual.producer_id;
209 state->length_unit = actual.length_unit;
210 state->energy_unit = actual.energy_unit;
211 state->desc.schema_id = state->schema.c_str();
212 state->desc.producer_id = state->producer.c_str();
213 state->desc.length_unit = state->length_unit.c_str();
214 state->desc.energy_unit = state->energy_unit.c_str();
215 state->desc.energy_sign = actual.energy_sign;
216 state->desc.gradient_sign = actual.gradient_sign;
217 state->desc.operations = actual.operations;
218 state->desc.tensor_device_type = actual.tensor_device_type;
219 state->desc.tensor_dtype_code = actual.tensor_dtype_code;
220 state->desc.tensor_dtype_bits =
221 static_cast<std::uint8_t>(actual.tensor_dtype_bits);
222 state->desc.tensor_dtype_lanes =
223 static_cast<std::uint8_t>(actual.tensor_dtype_lanes);
224 state->desc.tensor_layout = actual.tensor_layout;
225 state->desc.callback_lifetime = actual.callback_lifetime;
226 state->obj.dim = dim;
227 state->obj.low = state->low.data();
228 state->obj.high = state->high.data();
229 state->obj.eval_fn = eval_cb;
230 state->obj.grad_fn = grad_cb;
231 state->obj.user_data = state.get();
232 state->obj.free_fn = nullptr;
233 state->obj.descriptor = &state->desc;
234 if (!compatible(actual, eon_requirement())) {
235 throw std::runtime_error("eOn eindir objective descriptor was rejected");
236 }
237 const auto stamp = eindir_core_abi_stamp();
238 if (eindir_core_abi_compatible(&stamp) == 0 ||
239 !abi_accepts_gradient(stamp.abi_major, 1, stamp.features)) {
240 throw std::runtime_error("incompatible eindir ABI stamp");
241 }
242 if (eindir_objective_has_grad(&state->obj) == 0) {
243 throw std::runtime_error("eindir objective has no gradient");
244 }
245 eindir_objective_descriptor_t required_desc = state->desc;
246 required_desc.producer_id = "";
247 if (eindir_objective_descriptor_compatible(&state->desc, &required_desc) ==
248 0) {
249 const char *err = eindir_last_error();
250 throw std::runtime_error(err != nullptr ? err
251 : "eindir descriptor mismatch");
252 }
253 const auto xts = xts_abi_stamp();
254 provenance_slot() =
255 std::format("xts-{}.{}.{}+eindir-{}.{}-layout-{}", xts.abi_major,
256 xts.abi_minor, xts.layout_revision, stamp.abi_major,
257 stamp.abi_minor, stamp.objective_layout);
258 return state.release();
259#endif
260}
virtual int degreesOfFreedom()=0
bool abi_accepts_gradient(std::uint32_t major, std::uint32_t expected_major, std::uint64_t features)
Major must match and the gradient feature bit must be set.
View eon_requirement()
What an eOn minimization may consume: eV, angstrom, analytic forces.
bool compatible(const View &actual, const View &required)
Nonzero when actual satisfies required. Schema id is never a wildcard.

◆ compatible()

bool eonc::xtsci_eindir::compatible ( const View & actual,
const View & required )

Nonzero when actual satisfies required. Schema id is never a wildcard.

Definition at line 156 of file XtsciEindir.cpp.

156 {
157 if (actual.schema_id.empty() || actual.schema_id != required.schema_id) {
158 return false;
159 }
160 if (!text_ok(actual.producer_id, required.producer_id) ||
161 !text_ok(actual.length_unit, required.length_unit) ||
162 !text_ok(actual.energy_unit, required.energy_unit)) {
163 return false;
164 }
165 if (!scalar_ok(actual.energy_sign, required.energy_sign) ||
166 !scalar_ok(actual.gradient_sign, required.gradient_sign)) {
167 return false;
168 }
169 if ((actual.operations & required.operations) != required.operations) {
170 return false;
171 }
172 return scalar_ok(actual.tensor_device_type, required.tensor_device_type) &&
173 scalar_ok(actual.tensor_dtype_code, required.tensor_dtype_code) &&
174 scalar_ok(actual.tensor_dtype_bits, required.tensor_dtype_bits) &&
175 scalar_ok(actual.tensor_dtype_lanes, required.tensor_dtype_lanes) &&
176 scalar_ok(static_cast<long>(actual.tensor_layout),
177 static_cast<long>(required.tensor_layout)) &&
178 scalar_ok(static_cast<long>(actual.callback_lifetime),
179 static_cast<long>(required.callback_lifetime));
180}
std::uint64_t operations
Definition XtsciEindir.h:33
std::uint32_t callback_lifetime
Definition XtsciEindir.h:39
std::uint32_t tensor_layout
Definition XtsciEindir.h:38

◆ eon_requirement()

View eonc::xtsci_eindir::eon_requirement ( )

What an eOn minimization may consume: eV, angstrom, analytic forces.

Definition at line 133 of file XtsciEindir.cpp.

133 {
134 View view;
135 view.schema_id = kSchemaId;
136 view.length_unit = "angstrom";
137 view.energy_unit = "eV";
138 view.energy_sign = 1;
139 view.gradient_sign = 1;
143 view.tensor_dtype_bits = 64;
144 view.tensor_dtype_lanes = 1;
147 return view;
148}
constexpr int kDtypeFloat
Definition XtsciEindir.h:46
constexpr int kDeviceCpu
Definition XtsciEindir.h:45
constexpr const char * kSchemaId
Definition XtsciEindir.h:42
constexpr std::uint64_t kOpEnergy
Definition XtsciEindir.h:43
constexpr std::uint64_t kOpForces
Definition XtsciEindir.h:44
constexpr std::uint32_t kLifetimeBorrowed
Definition XtsciEindir.h:48
constexpr std::uint32_t kLayoutContiguous
Definition XtsciEindir.h:47
Semantic objective contract shared with eindir_objective_descriptor_t.
Definition XtsciEindir.h:26

◆ eval_grad()

int eonc::xtsci_eindir::eval_grad ( State * state,
const DLManagedTensorVersioned * x,
double * value,
DLManagedTensorVersioned * gradient )

One fused energy and gradient through the borrowed eindir handle.

Definition at line 270 of file XtsciEindir.cpp.

271 {
272#ifndef WITH_EINDIR
273 (void)state;
274 (void)x;
275 (void)value;
276 (void)gradient;
277 return 2;
278#else
279 if (state == nullptr) {
280 return 1;
281 }
282 if (eindir_objective_eval(&state->obj, x, value) != EINDIR_SUCCESS ||
283 eindir_objective_grad(&state->obj, x, gradient) != EINDIR_SUCCESS) {
284 return 2;
285 }
286 return 0;
287#endif
288}

◆ minimize()

int eonc::xtsci_eindir::minimize ( State * state,
double * x,
std::size_t n,
std::size_t maxiter,
double gtol,
double istep,
std::size_t memory,
int method,
double * value_out )

xts_minimize_eindir on a caller-owned buffer. The caller keeps State.

Definition at line 290 of file XtsciEindir.cpp.

292 {
293#ifndef WITH_EINDIR
294 (void)state;
295 (void)x;
296 (void)n;
297 (void)maxiter;
298 (void)gtol;
299 (void)istep;
300 (void)memory;
301 (void)method;
302 (void)value_out;
303 return 1;
304#else
305 if (state == nullptr || x == nullptr) {
306 return 1;
307 }
308 auto *tensor = xts_tensor_borrow_cpu_f64(x, n);
309 if (tensor == nullptr) {
310 return 2;
311 }
312 const auto stamp = eindir_core_abi_stamp();
313 xts_control_t control{maxiter, gtol, istep, memory, 0.0};
314 xts_report_t report{};
315 const auto status =
316 xts_minimize_eindir(&state->obj, &stamp, tensor, &control,
317 static_cast<xts_method_t>(method), &report);
318 xts_tensor_free(tensor);
319 if (value_out != nullptr) {
320 *value_out = report.value;
321 }
322 return static_cast<int>(status);
323#endif
324}

◆ provenance()

const std::string & eonc::xtsci_eindir::provenance ( )

Stamp text from the last successful eindir bind. Empty when unused.

Definition at line 187 of file XtsciEindir.cpp.

187{ return provenance_slot(); }

◆ release()

void eonc::xtsci_eindir::release ( State * state)

Definition at line 262 of file XtsciEindir.cpp.

262 {
263#ifdef WITH_EINDIR
264 delete state;
265#else
266 (void)state;
267#endif
268}

◆ rgpot_ev_angstrom()

View eonc::xtsci_eindir::rgpot_ev_angstrom ( )

rgpot producer advertising the same units and tensor contract.

Definition at line 150 of file XtsciEindir.cpp.

150 {
151 View view = eon_requirement();
152 view.producer_id = "rgpot";
153 return view;
154}

Variable Documentation

◆ kDeviceCpu

int eonc::xtsci_eindir::kDeviceCpu = 1
inlineconstexpr

Definition at line 45 of file XtsciEindir.h.

◆ kDtypeFloat

int eonc::xtsci_eindir::kDtypeFloat = 2
inlineconstexpr

Definition at line 46 of file XtsciEindir.h.

◆ kFeatureGradient

std::uint64_t eonc::xtsci_eindir::kFeatureGradient = 1ull << 0
inlineconstexpr

Definition at line 49 of file XtsciEindir.h.

◆ kLayoutContiguous

std::uint32_t eonc::xtsci_eindir::kLayoutContiguous = 1
inlineconstexpr

Definition at line 47 of file XtsciEindir.h.

◆ kLifetimeBorrowed

std::uint32_t eonc::xtsci_eindir::kLifetimeBorrowed = 1
inlineconstexpr

Definition at line 48 of file XtsciEindir.h.

◆ kOpEnergy

std::uint64_t eonc::xtsci_eindir::kOpEnergy = 1ull << 0
inlineconstexpr

Definition at line 43 of file XtsciEindir.h.

◆ kOpForces

std::uint64_t eonc::xtsci_eindir::kOpForces = 1ull << 1
inlineconstexpr

Definition at line 44 of file XtsciEindir.h.

◆ kSchemaId

const char* eonc::xtsci_eindir::kSchemaId = "eindir.objective-descriptor.v1"
inlineconstexpr

Definition at line 42 of file XtsciEindir.h.