WPILibC++ 2027.0.0-alpha-2
Loading...
Searching...
No Matches
multistart.hpp
Go to the documentation of this file.
1// Copyright (c) Sleipnir contributors
2
3#pragma once
4
5#include <algorithm>
6#include <future>
7#include <span>
8
10
13
14namespace slp {
15
16/**
17 * The result of a multistart solve.
18 *
19 * @tparam DecisionVariables The type containing the decision variable initial
20 * guess.
21 */
22template <typename DecisionVariables>
24 /// The solver exit status.
26 /// The solution's cost.
27 double cost;
28 /// The decision variables.
29 DecisionVariables variables;
30};
31
32/**
33 * Solves an optimization problem from different starting points in parallel,
34 * then returns the solution with the lowest cost.
35 *
36 * Each solve is performed on a separate thread. Solutions from successful
37 * solves are always preferred over solutions from unsuccessful solves, and cost
38 * (lower is better) is the tiebreaker between successful solves.
39 *
40 * @tparam DecisionVariables The type containing the decision variable initial
41 * guess.
42 * @param solve A user-provided function that takes a decision variable initial
43 * guess and returns a MultistartResult.
44 * @param initial_guesses A list of decision variable initial guesses to try.
45 */
46template <typename DecisionVariables>
49 const DecisionVariables& initial_guess)>
50 solve,
51 std::span<const DecisionVariables> initial_guesses) {
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
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
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition SmallVector.h:1198
reference emplace_back(ArgTypes &&... Args)
Definition SmallVector.h:939
void reserve(size_type N)
Definition SmallVector.h:665
size_t size() const
Definition SmallVector.h:85
Definition expression_graph.hpp:11
ExitStatus
Solver exit status.
Definition exit_status.hpp:16
@ SUCCESS
Solved the problem to the desired tolerance.
SLEIPNIR_DLLEXPORT VariableMatrix solve(const VariableMatrix &A, const VariableMatrix &B)
Solves the VariableMatrix equation AX = B for X.
MultistartResult< DecisionVariables > Multistart(function_ref< MultistartResult< DecisionVariables >(const DecisionVariables &initial_guess)> solve, std::span< const DecisionVariables > initial_guesses)
Solves an optimization problem from different starting points in parallel, then returns the solution ...
Definition multistart.hpp:47
The result of a multistart solve.
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