14 #ifndef PDLP_TEST_UTIL_H_
15 #define PDLP_TEST_UTIL_H_
23 #include "Eigen/SparseCore"
24 #include "absl/log/check.h"
25 #include "absl/types/span.h"
26 #include "gmock/gmock.h"
27 #include "gtest/gtest.h"
51 void VerifyTestLp(
const QuadraticProgram& qp,
bool maximize =
false);
207 const Eigen::SparseMatrix<double, Eigen::ColMajor, int64_t>& sparse_mat);
214 return std::abs(std::get<0>(arg) - std::get<1>(arg)) <= tolerance;
218 testing::Matcher<float> matcher = testing::FloatEq(std::get<1>(arg));
219 return matcher.Matches(std::get<0>(arg));
228 template <
typename T>
230 absl::Span<
const absl::Span<const T>> rows) {
231 Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic> result(0, rows.size());
233 result.resize(rows.size(), rows[0].size());
235 for (
int i = 0; i < rows.size(); ++i) {
236 CHECK_EQ(rows[0].size(), rows[i].size());
237 result.row(i) = Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>(
238 &rows[i][0], rows[i].size());
253 template <
typename ContainerType>
254 decltype(testing::Pointwise(internal::TupleIsNear(0.0), ContainerType()))
256 return testing::Pointwise(internal::TupleIsNear(tolerance), container);
271 template <
typename ContainerType>
272 decltype(testing::Pointwise(internal::TupleFloatEq(), ContainerType()))
274 return testing::Pointwise(internal::TupleFloatEq(), container);
278 template <
typename EigenType>
279 Eigen::Array<
typename EigenType::Scalar, Eigen::Dynamic, Eigen::Dynamic,
286 template <
typename Scalar>
288 const Eigen::Array<Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>&
290 return absl::Span<const Scalar>(array.data(), array.size());
302 "array is near " + testing::PrintToString(expected_array) +
303 " within tolerance " + testing::PrintToString(tolerance)) {
304 if (arg.rows() != expected_array.rows() ||
305 arg.cols() != expected_array.cols()) {
306 *result_listener <<
"where shape (" << expected_array.rows() <<
", "
307 << expected_array.cols() <<
") doesn't match ("
308 << arg.rows() <<
", " << arg.cols() <<
")";
317 return ExplainMatchResult(
330 "array is almost equal to " +
331 testing::PrintToString(expected_array)) {
332 if (arg.rows() != expected_array.rows() ||
333 arg.cols() != expected_array.cols()) {
334 *result_listener <<
"where shape (" << expected_array.rows() <<
", "
335 << expected_array.cols() <<
") doesn't match ("
336 << arg.rows() <<
", " << arg.cols() <<
")";
345 return ExplainMatchResult(
359 template <
typename T>
360 EigenArrayNearMatcherP2<Eigen::Array<T, Eigen::Dynamic, 1>,
double>
362 Eigen::Array<T, Eigen::Dynamic, 1> temp_array =
363 Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>(&data[0],
368 template <
typename T>
369 EigenArrayNearMatcherP2<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>,
double>
374 template <
typename T>
376 absl::Span<const T> data) {
377 Eigen::Array<T, Eigen::Dynamic, 1> temp_array =
378 Eigen::Map<const Eigen::Array<T, Eigen::Dynamic, 1>>(&data[0],
383 template <
typename T>
384 EigenArrayEqMatcherP<Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic>>
394 template <
typename Scalar,
int Rows,
int Cols,
int Options,
int MaxRows,
396 void PrintTo(
const Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols>& array,
398 IOFormat format(StreamPrecision, 0,
", ",
",\n",
"[",
"]",
"[",
"]");
399 *os <<
"\n" << array.format(format);
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)
QuadraticProgram SmallDualInfeasibleLp()
QuadraticProgram TestDiagonalQp2()
Eigen::Array< typename EigenType::Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > EvalAsColMajorEigenArray(const EigenType &input)
::Eigen::ArrayXXd ToDense(const Eigen::SparseMatrix< double, Eigen::ColMajor, int64_t > &sparse_mat)
absl::Span< const Scalar > EigenArrayAsSpan(const Eigen::Array< Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > &array)
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()
QuadraticProgram TinyLp()
void VerifyTestLp(const QuadraticProgram &qp, bool maximize)
QuadraticProgram LpWithoutConstraints()
QuadraticProgram SmallInvalidProblemLp()
void VerifyTestDiagonalQp1(const QuadraticProgram &qp, bool maximize)
EigenArrayNearMatcherP2< Eigen::Array< T, Eigen::Dynamic, 1 >, double > EigenArrayNear(absl::Span< const T > data, double tolerance)
MATCHER_P(EigenArrayEq, expected_array, "array is almost equal to "+testing::PrintToString(expected_array))
QuadraticProgram SmallPrimalDualInfeasibleLp()
EigenArrayEqMatcherP< Eigen::Array< T, Eigen::Dynamic, 1 > > EigenArrayEq(absl::Span< const T > data)
QuadraticProgram TestLp()
QuadraticProgram SmallInitializationLp()
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)