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