Sleipnir C++ API
Loading...
Searching...
No Matches
multistart.hpp
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <algorithm>
6#include <future>
7#include <span>
8
9#include <gch/small_vector.hpp>
10
11#include "sleipnir/optimization/solver/exit_status.hpp"
12#include "sleipnir/util/function_ref.hpp"
13
14namespace slp {
15
22template <typename DecisionVariables>
25 ExitStatus status;
27 double cost;
29 DecisionVariables variables;
30};
31
46template <typename DecisionVariables>
49 const DecisionVariables& initial_guess)>
50 solve,
51 std::span<const DecisionVariables> initial_guesses) {
52 gch::small_vector<std::future<MultistartResult<DecisionVariables>>> futures;
53 futures.reserve(initial_guesses.size());
54
55 for (const auto& initial_guess : initial_guesses) {
56 futures.emplace_back(std::async(std::launch::async, solve, initial_guess));
57 }
58
59 gch::small_vector<MultistartResult<DecisionVariables>> results;
60 results.reserve(futures.size());
61
62 for (auto& future : futures) {
63 results.emplace_back(future.get());
64 }
65
66 return *std::ranges::min_element(results, [](const auto& a, const auto& b) {
67 // Prioritize successful solve
68 if (a.status == ExitStatus::SUCCESS && b.status != ExitStatus::SUCCESS) {
69 return true;
70 }
71
72 // Otherwise prioritize solution with lower cost
73 return a.cost < b.cost;
74 });
75}
76
77} // namespace slp
Definition function_ref.hpp:13
Definition multistart.hpp:23
double cost
The solution's cost.
Definition multistart.hpp:27
ExitStatus status
The solver exit status.
Definition multistart.hpp:25
DecisionVariables variables
The decision variables.
Definition multistart.hpp:29