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
23template <typename Scalar, typename DecisionVariables>
32
48template <typename Scalar, typename DecisionVariables>
52 solve,
53 std::span<const DecisionVariables> initial_guesses) {
54 gch::small_vector<std::future<MultistartResult<Scalar, DecisionVariables>>>
55 futures;
56 futures.reserve(initial_guesses.size());
57
58 for (const auto& initial_guess : initial_guesses) {
59 futures.emplace_back(std::async(std::launch::async, solve, initial_guess));
60 }
61
62 gch::small_vector<MultistartResult<Scalar, DecisionVariables>> results;
63 results.reserve(futures.size());
64
65 for (auto& future : futures) {
66 results.emplace_back(future.get());
67 }
68
69 return *std::ranges::min_element(results, [](const auto& a, const auto& b) {
70 // Prioritize successful solve
71 if (a.status == ExitStatus::SUCCESS && b.status != ExitStatus::SUCCESS) {
72 return true;
73 }
74
75 // Otherwise prioritize solution with lower cost
76 return a.cost < b.cost;
77 });
78}
79
80} // namespace slp
Definition intrusive_shared_ptr.hpp:29
Definition function_ref.hpp:13
Definition multistart.hpp:24
ExitStatus status
The solver exit status.
Definition multistart.hpp:26
Scalar cost
The solution's cost.
Definition multistart.hpp:28
DecisionVariables variables
The decision variables.
Definition multistart.hpp:30