| 352 | } |
| 353 | |
| 354 | py::dict execute_case(const py::dict &request) { |
| 355 | const auto execute_case_wall_start = std::chrono::steady_clock::now(); |
| 356 | py::dict run_meta; |
| 357 | run_meta["backend"] = "cpp_core"; |
| 358 | run_meta["cpp_core_version"] = "0.1.0"; |
| 359 | |
| 360 | std::string mode = "unknown"; |
| 361 | try { |
| 362 | if (!request.contains("mode")) { |
| 363 | return make_error_result( |
| 364 | "INPUT_INVALID", "PREPARE", "mode is required", run_meta, "other", 0); |
| 365 | } |
| 366 | mode = py::cast<std::string>(request["mode"]); |
| 367 | run_meta["mode"] = mode; |
| 368 | |
| 369 | std::optional<int> omp_threads_resources; |
| 370 | if (request.contains("resources") && py::isinstance<py::dict>(request["resources"])) { |
| 371 | const py::dict resources = py::cast<py::dict>(request["resources"]); |
| 372 | omp_threads_resources = parse_optional_positive_int_dict_entry( |
| 373 | resources, "omp_num_threads", "request.resources"); |
| 374 | } |
| 375 | std::optional<int> omp_threads_runtime_policy; |
| 376 | if (request.contains("runtime_policy") && py::isinstance<py::dict>(request["runtime_policy"])) { |
| 377 | const py::dict runtime_policy = py::cast<py::dict>(request["runtime_policy"]); |
| 378 | omp_threads_runtime_policy = parse_optional_positive_int_dict_entry( |
| 379 | runtime_policy, "omp_num_threads", "request.runtime_policy"); |
| 380 | } |
| 381 | const std::optional<int> omp_threads_env = parse_optional_positive_int_env("OMP_NUM_THREADS"); |
| 382 | |
| 383 | int omp_threads_target = 1; |
| 384 | std::string omp_threads_source = "default"; |
| 385 | if (omp_threads_resources.has_value()) { |
| 386 | omp_threads_target = *omp_threads_resources; |
| 387 | omp_threads_source = "resources"; |
| 388 | } else if (omp_threads_runtime_policy.has_value()) { |
| 389 | omp_threads_target = *omp_threads_runtime_policy; |
| 390 | omp_threads_source = "runtime_policy"; |
| 391 | } else if (omp_threads_env.has_value()) { |
| 392 | omp_threads_target = *omp_threads_env; |
| 393 | omp_threads_source = "env"; |
| 394 | } |
| 395 | |
| 396 | #ifdef MaterialDFT_HAS_OPENMP |
| 397 | omp_set_num_threads(omp_threads_target); |
| 398 | const int omp_threads_actual = std::max(1, omp_get_max_threads()); |
| 399 | #else |
| 400 | const int omp_threads_actual = 1; |
| 401 | #endif |
| 402 | run_meta["omp_num_threads_requested"] = omp_threads_target; |
| 403 | run_meta["omp_num_threads_source"] = omp_threads_source; |
| 404 | run_meta["omp_num_threads_actual"] = omp_threads_actual; |
| 405 | |
| 406 | if (mode == "relax") { |
| 407 | return execute_relax_case( |
| 408 | request, |
| 409 | run_meta, |
| 410 | [](const py::dict& step_request) { return execute_case(step_request); }); |
| 411 | } |
nothing calls this directly
no test coverage detected