|
| 1 | +#include <boost/test/unit_test.hpp> |
| 2 | + |
| 3 | +#include <algorithm> |
| 4 | + |
| 5 | +#include "scippp/model.hpp" |
| 6 | +#include "scippp/solving_statistics.hpp" |
| 7 | + |
| 8 | +using namespace scippp; |
| 9 | +using namespace std; |
| 10 | + |
| 11 | +BOOST_AUTO_TEST_SUITE(LinExpression) |
| 12 | + |
| 13 | +BOOST_AUTO_TEST_CASE(AddOneVar) |
| 14 | +{ |
| 15 | + Model model("Simple"); |
| 16 | + array coeff { 1, 1 }; |
| 17 | + const auto& [x1, x2] = model.addVars<2>("x_", coeff); |
| 18 | + LinExpr l; |
| 19 | + l += x1; // allocates memory, thus slow |
| 20 | + l += x2; // allocates memory again, thus slow |
| 21 | + model.addConstr(l <= 1, "capacity"); |
| 22 | + model.setObjsense(Sense::MAXIMIZE); |
| 23 | + model.solve(); |
| 24 | + BOOST_TEST(model.getSolvingStatistic(statistics::PRIMALBOUND) == 1); |
| 25 | +} |
| 26 | + |
| 27 | +BOOST_AUTO_TEST_CASE(CtorArray) |
| 28 | +{ |
| 29 | + array objCoeff { 1.0, 1.0 }; |
| 30 | + |
| 31 | + Model m1("m1"); |
| 32 | + const auto VARS1 = m1.addVars<2>("x_", objCoeff); |
| 33 | + LinExpr l1(VARS1); |
| 34 | + m1.addConstr(l1 <= 1, "capacity"); |
| 35 | + m1.setObjsense(Sense::MAXIMIZE); |
| 36 | + m1.solve(); |
| 37 | + BOOST_TEST(m1.getSolvingStatistic(statistics::PRIMALBOUND) == 1.0); |
| 38 | + |
| 39 | + Model m2("m2"); |
| 40 | + const auto VARS2 = m2.addVars<2>("x_", objCoeff); |
| 41 | + LinExpr l2(VARS2, objCoeff); // same as before, but different c'tor |
| 42 | + m2.addConstr(l2 <= 1, "capacity"); |
| 43 | + m2.setObjsense(Sense::MAXIMIZE); |
| 44 | + m2.solve(); |
| 45 | + BOOST_TEST(m2.getSolvingStatistic(statistics::PRIMALBOUND) == 1.0); |
| 46 | + |
| 47 | + const double FAC { 2.0 }; |
| 48 | + array constrCoeff { FAC, FAC }; |
| 49 | + |
| 50 | + Model m3("m3"); |
| 51 | + const auto VARS3 = m3.addVars<2>("x_", objCoeff); |
| 52 | + LinExpr l3(VARS3, constrCoeff); |
| 53 | + m3.addConstr(l3 <= 1, "capacity"); |
| 54 | + m3.setObjsense(Sense::MAXIMIZE); |
| 55 | + m3.solve(); |
| 56 | + BOOST_TEST(m3.getSolvingStatistic(statistics::PRIMALBOUND) == 1.0 / FAC); |
| 57 | +} |
| 58 | + |
| 59 | +BOOST_AUTO_TEST_CASE(AddArray) |
| 60 | +{ |
| 61 | + Model model("Simple"); |
| 62 | + array coeff { 1, 1 }; |
| 63 | + const auto VARS = model.addVars<2>("x_", coeff); |
| 64 | + LinExpr l; |
| 65 | + l += VARS; |
| 66 | + model.addConstr(l <= 1, "capacity"); |
| 67 | + model.setObjsense(Sense::MAXIMIZE); |
| 68 | + model.solve(); |
| 69 | + BOOST_TEST(model.getSolvingStatistic(statistics::PRIMALBOUND) == 1); |
| 70 | +} |
| 71 | + |
| 72 | +BOOST_AUTO_TEST_CASE(AddVector) |
| 73 | +{ |
| 74 | + Model model("Simple"); |
| 75 | + array coeff { 1, 1 }; |
| 76 | + const auto A_VARS { model.addVars<2>("x_", coeff) }; |
| 77 | + const vector<Var> VARS { A_VARS.begin(), A_VARS.end() }; |
| 78 | + LinExpr l1; |
| 79 | + l1 += VARS; |
| 80 | + model.addConstr(l1 <= 1, "capacity1"); |
| 81 | + LinExpr l2(VARS, vector { 2.0, 2.0 }); |
| 82 | + model.addConstr(l2 <= 2, "capacity2"); // duplicate, but different c'tor |
| 83 | + model.setObjsense(Sense::MAXIMIZE); |
| 84 | + model.solve(); |
| 85 | + BOOST_TEST(model.getSolvingStatistic(statistics::PRIMALBOUND) == 1); |
| 86 | +} |
| 87 | + |
| 88 | +BOOST_AUTO_TEST_CASE(AddInitializerList) |
| 89 | +{ |
| 90 | + Model model("Simple"); |
| 91 | + array coeff { 1, 1 }; |
| 92 | + const auto& [x1, x2] = model.addVars<2>("x_", coeff); |
| 93 | + LinExpr l; |
| 94 | + l += { x1, x2 }; |
| 95 | + model.addConstr(l <= 1, "capacity"); |
| 96 | + // duplicate, but different c'tor: |
| 97 | + model.addConstr(LinExpr({ x1, x2 }, { 2.0, 2.0 }) <= 2, "capacity2"); |
| 98 | + model.setObjsense(Sense::MAXIMIZE); |
| 99 | + model.solve(); |
| 100 | + BOOST_TEST(model.getSolvingStatistic(statistics::PRIMALBOUND) == 1); |
| 101 | +} |
| 102 | + |
| 103 | +BOOST_AUTO_TEST_CASE(CheckInternalsUsingFriendStruct) |
| 104 | +{ |
| 105 | + const double VAL { 2.0 }; |
| 106 | + for (size_t num { 1 }; num < 4; ++num) { |
| 107 | + Model m("m"); |
| 108 | + const auto VARS = m.addVars("x", num); |
| 109 | + |
| 110 | + LinExpr lDef(VARS); |
| 111 | + BOOST_TEST(lDef.getConstant() == 0); |
| 112 | + BOOST_TEST(lDef.m_constant == 0); |
| 113 | + BOOST_TEST(lDef.m_vars.size() == num); |
| 114 | + BOOST_TEST(lDef.m_coeffs.size() == num); |
| 115 | + BOOST_TEST(all_of(lDef.m_coeffs.begin(), lDef.m_coeffs.end(), [](double d) { return d == 1; })); |
| 116 | + |
| 117 | + const vector COEFF(num, VAL); |
| 118 | + LinExpr lCoeff(VARS, COEFF); |
| 119 | + BOOST_TEST(lCoeff.getConstant() == 0); |
| 120 | + BOOST_TEST(lCoeff.m_constant == 0); |
| 121 | + BOOST_TEST(lCoeff.m_vars.size() == num); |
| 122 | + BOOST_TEST(lCoeff.m_coeffs.size() == num); |
| 123 | + BOOST_TEST(all_of(lCoeff.m_coeffs.begin(), lCoeff.m_coeffs.end(), [&VAL](double d) { return d == VAL; })); |
| 124 | + } |
| 125 | +} |
| 126 | + |
| 127 | +BOOST_AUTO_TEST_SUITE_END() |
0 commit comments