WPILibC++ 2027.0.0-alpha-4
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/// The result of a multistart solve.
17///
18/// @tparam Scalar Scalar type.
19/// @tparam DecisionVariables The type containing the decision variable initial
20/// guess.
21template <typename Scalar, typename DecisionVariables>
23 /// The solver exit status.
25 /// The solution's cost.
26 Scalar cost;
27 /// The decision variables.
28 DecisionVariables variables;
29};
30
31/// Solves an optimization problem from different starting points in parallel,
32/// then returns the solution with the lowest cost.
33///
34/// Each solve is performed on a separate thread. Solutions from successful
35/// solves are always preferred over solutions from unsuccessful solves, and
36/// cost (lower is better) is the tiebreaker between successful solves.
37///
38/// @tparam Scalar Scalar type.
39/// @tparam DecisionVariables The type containing the decision variable initial
40/// guess.
41/// @param solve A user-provided function that takes a decision variable initial
42/// guess and returns a MultistartResult.
43/// @param initial_guesses A list of decision variable initial guesses to try.
44template <typename Scalar, typename DecisionVariables>
47 const DecisionVariables& initial_guess)>
48 solve,
49 std::span<const DecisionVariables> initial_guesses) {
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
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 function_ref.hpp:13
wpi::util::SmallVector< T > small_vector
Definition small_vector.hpp:10
Definition expression_graph.hpp:11
VariableMatrix< Scalar > solve(const VariableMatrix< Scalar > &A, const VariableMatrix< Scalar > &B)
Solves the VariableMatrix equation AX = B for X.
Definition variable_matrix.hpp:1382
ExitStatus
Solver exit status. Negative values indicate failure.
Definition exit_status.hpp:14
@ SUCCESS
Solved the problem to the desired tolerance.
Definition exit_status.hpp:16
MultistartResult< Scalar, DecisionVariables > multistart(function_ref< MultistartResult< Scalar, 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:45
The result of a multistart solve.
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