forked from pz4kybsvg/Conception
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.5 KiB
68 lines
2.5 KiB
#pragma once
|
|
|
|
#include <optional>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "drake/solvers/mathematical_program.h"
|
|
#include "drake/solvers/solver_interface.h"
|
|
|
|
namespace drake {
|
|
namespace solvers {
|
|
namespace test {
|
|
/// Run solver.Solve() on the given @p prog. If the solver is absent or does
|
|
/// not find a solution, stop immediately via an exception. (Were we to
|
|
/// continue, testing statements that examine the results would be likely to
|
|
/// fail with confusing messages, so best to avoid them entirely.)
|
|
MathematicalProgramResult RunSolver(
|
|
const MathematicalProgram& prog, const SolverInterface& solver,
|
|
const std::optional<Eigen::VectorXd>& initial_guess = {},
|
|
const std::optional<SolverOptions>& solver_options = {});
|
|
|
|
/// Determine if two bindings are the same. Two bindings are the same if
|
|
///
|
|
/// 1. They contain the same constraint pointer.
|
|
/// 2. Their bound variables are the same.
|
|
template <typename Constraint>
|
|
::testing::AssertionResult IsBindingEqual(const Binding<Constraint>& binding1,
|
|
const Binding<Constraint>& binding2) {
|
|
if (binding1.evaluator() != binding2.evaluator()) {
|
|
return ::testing::AssertionFailure()
|
|
<< "Constraint pointers are not the same.";
|
|
}
|
|
if (binding1.variables().rows() != binding2.variables().rows()) {
|
|
return ::testing::AssertionFailure()
|
|
<< "Constraint variable sizes are not the same.";
|
|
}
|
|
for (int i = 0; i < binding1.variables().rows(); ++i) {
|
|
if (!binding1.variables()(i).equal_to(binding2.variables()(i))) {
|
|
return ::testing::AssertionFailure()
|
|
<< "Constraint variable mismatch:(" << binding1.variables()(i)
|
|
<< " vs. " << binding2.variables()(i) << ")";
|
|
}
|
|
}
|
|
return ::testing::AssertionSuccess() << "Same binding.";
|
|
}
|
|
|
|
/// Determines if two vectors of bindings are the same.
|
|
template <typename Constraint>
|
|
::testing::AssertionResult IsVectorOfBindingEqual(
|
|
const std::vector<Binding<Constraint>>& bindings1,
|
|
const std::vector<Binding<Constraint>>& bindings2) {
|
|
if (bindings1.size() != bindings2.size()) {
|
|
return ::testing::AssertionFailure()
|
|
<< "Size mismatches: (" << bindings1.size() << " vs. "
|
|
<< bindings2.size() << ").";
|
|
}
|
|
for (int i = 0; i < static_cast<int>(bindings1.size()); ++i) {
|
|
auto result = IsBindingEqual(bindings1[i], bindings2[i]);
|
|
if (!result) return result;
|
|
}
|
|
return ::testing::AssertionSuccess() << " Same bindings.";
|
|
}
|
|
} // namespace test
|
|
} // namespace solvers
|
|
} // namespace drake
|