14#ifndef PDLP_TEST_UTIL_H_
15#define PDLP_TEST_UTIL_H_
23#include "Eigen/SparseCore"
24#include "absl/types/span.h"
25#include "gmock/gmock.h"
26#include "gtest/gtest.h"
51void VerifyTestLp(
const QuadraticProgram& qp,
bool maximize =
false);
202void VerifyTestQp(
const QuadraticProgram& qp,
bool maximize =
false);
208 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& sparse_mat);
215 return std::abs(std::get<0>(arg) - std::get<1>(arg)) <= tolerance;
219 testing::Matcher<float> matcher = testing::FloatEq(std::get<1>(arg));
220 return matcher.Matches(std::get<0>(arg));
231 absl::Span<
const absl::Span<const T>> rows) {
232 Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic> result(0, rows.size());
234 result.resize(rows.size(), rows[0].size());
236 for (
int i = 0; i < rows.size(); ++i) {
237 CHECK_EQ(rows[0].size(), rows[i].size());
238 result.row(i) = Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>(
239 &rows[i][0], rows[i].size());
247template <
typename LhsType>
249 const testing::Matcher<LhsType>& matcher,
bool negation) {
250 std::stringstream ss;
252 matcher.DescribeNegationTo(&ss);
254 matcher.DescribeTo(&ss);
269template <
typename ContainerType>
270decltype(testing::Pointwise(internal::TupleIsNear(0.0), ContainerType()))
272 return testing::Pointwise(internal::TupleIsNear(tolerance), container);
287template <
typename ContainerType>
288decltype(testing::Pointwise(internal::TupleFloatEq(), ContainerType()))
290 return testing::Pointwise(internal::TupleFloatEq(), container);
294template <
typename EigenType>
295Eigen::Array<
typename EigenType::Scalar, Eigen::Dynamic, Eigen::Dynamic,
302template <
typename Scalar>
304 const Eigen::Array<Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>&
306 return absl::Span<const Scalar>(array.data(), array.size());
318 "array is near " + testing::PrintToString(expected_array) +
319 " within tolerance " + testing::PrintToString(tolerance)) {
320 if (arg.rows() != expected_array.rows() ||
321 arg.cols() != expected_array.cols()) {
322 *result_listener <<
"where shape (" << expected_array.rows() <<
", "
323 << expected_array.cols() <<
") doesn't match ("
324 << arg.rows() <<
", " << arg.cols() <<
")";
332 return ExplainMatchResult(
345 "array is almost equal to " +
346 testing::PrintToString(expected_array)) {
347 if (arg.rows() != expected_array.rows() ||
348 arg.cols() != expected_array.cols()) {
349 *result_listener <<
"where shape (" << expected_array.rows() <<
", "
350 << expected_array.cols() <<
") doesn't match ("
351 << arg.rows() <<
", " << arg.cols() <<
")";
359 return ExplainMatchResult(
374EigenArrayNearMatcherP2<Eigen::Array<T, Eigen::Dynamic, 1>,
double>
376 Eigen::Array<T, Eigen::Dynamic, 1> temp_array =
377 Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>(&data[0],
383EigenArrayNearMatcherP2<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>,
double>
390 absl::Span<const T> data) {
391 Eigen::Array<T, Eigen::Dynamic, 1> temp_array =
392 Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>(&data[0],
398EigenArrayEqMatcherP<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>>
408template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
410void PrintTo(
const Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>& array,
412 IOFormat format(StreamPrecision, 0,
", ",
",\n",
"[",
"]",
"[",
"]");
413 *os <<
"\n" << array.format(format);
#define CHECK_EQ(val1, val2)
void PrintTo(const Array< Scalar, Rows, Cols, Options, MaxRows, MaxCols > &array, std::ostream *os)
MATCHER_P(TupleIsNear, tolerance, "is near")
MATCHER(TupleFloatEq, "is almost equal to")
Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic > EigenArray2DFromNestedSpans(absl::Span< const absl::Span< const T > > rows)
std::string GetMatcherDescriptionAsString(const testing::Matcher< LhsType > &matcher, bool negation)
QuadraticProgram SmallDualInfeasibleLp()
QuadraticProgram TestDiagonalQp2()
::Eigen::ArrayXXd ToDense(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &sparse_mat)
EigenArrayNearMatcherP2< Eigen::Array< T, Eigen::Dynamic, 1 >, double > EigenArrayNear(absl::Span< const T > data, double tolerance)
void VerifyTestQp(const QuadraticProgram &qp, bool maximize)
QuadraticProgram CorrelationClusteringStarLp()
MATCHER_P2(EigenArrayNear, expected_array, tolerance, "array is near "+testing::PrintToString(expected_array)+" within tolerance "+testing::PrintToString(tolerance))
decltype(testing::Pointwise(internal::TupleFloatEq(), ContainerType())) FloatArrayEq(const ContainerType &container)
QuadraticProgram TestDiagonalQp3()
EigenArrayEqMatcherP< Eigen::Array< T, Eigen::Dynamic, 1 > > EigenArrayEq(absl::Span< const T > data)
QuadraticProgram TinyLp()
void VerifyTestLp(const QuadraticProgram &qp, bool maximize)
Eigen::Array< typename EigenType::Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > EvalAsColMajorEigenArray(const EigenType &input)
QuadraticProgram LpWithoutConstraints()
QuadraticProgram SmallInvalidProblemLp()
MATCHER_P(EigenArrayEq, expected_array, "array is almost equal to "+testing::PrintToString(expected_array))
QuadraticProgram SmallPrimalDualInfeasibleLp()
QuadraticProgram TestLp()
QuadraticProgram SmallInitializationLp()
absl::Span< const Scalar > EigenArrayAsSpan(const Eigen::Array< Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > &array)
QuadraticProgram SmallPrimalInfeasibleLp()
QuadraticProgram SmallInconsistentVariableBoundsLp()
decltype(testing::Pointwise(internal::TupleIsNear(0.0), ContainerType())) FloatArrayNear(const ContainerType &container, double tolerance)
QuadraticProgram TestDiagonalQp1()
QuadraticProgram CorrelationClusteringLp()
static int input(yyscan_t yyscanner)