diff --git a/tests/test.cpp b/tests/test.cpp index cd0874c..8810825 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -1,10 +1,198 @@ #include "../s2ga.hpp" #include +#include #include -#include +#include +#include +#include + +using namespace Catch; + +constexpr double TOLERANCE = 1e-4; + +inline double sphere(double x, double y) +{ + return std::pow(x, 2.0) + std::pow(y, 2.0); +} + +TEST_CASE("sphere(0, 0) = 0") +{ + REQUIRE(sphere(0.0, 0.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double ackley(double x, double y) +{ + return -20.0 * std::exp(-0.2 * std::sqrt(0.5 * sphere(x, y))) - + std::exp(0.5 * (std::cos(2.0 * std::numbers::pi * x) + + std::cos(2.0 * std::numbers::pi * y))) + + std::numbers::e + 20.0; +} + +TEST_CASE("ackley(0, 0) = 0") +{ + REQUIRE(ackley(0.0, 0.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double rastrigin(double x, double y) +{ + const double A = 10.0; + return 2.0 * A + + (std::pow(x, 2.0) - A * std::cos(2.0 * std::numbers::pi * x)) + + (std::pow(y, 2.0) - A * std::cos(2.0 * std::numbers::pi * y)); +} + +TEST_CASE("rastrigin(0, 0) = 0") +{ + REQUIRE(rastrigin(0.0, 0.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double rosenbrock(double x, double y) +{ + return 100.0 * std::pow(y - std::pow(x, 2.0), 2.0) + std::pow(1.0 - x, 2.0); +} + +TEST_CASE("rosenbrock(1, 1) = 0") +{ + REQUIRE(rosenbrock(1.0, 1.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double bill(double x, double y) +{ + return std::pow(1.5 - x + x * y, 2.0) + + std::pow(2.25 - x + x * std::pow(y, 2.0), 2.0) + + std::pow(2.625 - x + x * std::pow(y, 3.0), 2.0); +} + +TEST_CASE("bill(3, 0.5) = 0") +{ + REQUIRE(bill(3.0, 0.5) == Approx(0.0).margin(TOLERANCE)); +} + +inline double goldstein_price(double x, double y) +{ + return (1.0 + std::pow(x + y + 1.0, 2.0) * + (19.0 - 14.0 * x + 3.0 * std::pow(x, 2.0) - 14.0 * y + + 6.0 * x * y + 3.0 * std::pow(y, 2.0))) * + (30.0 + std::pow(2.0 * x - 3.0 * y, 2.0) * + (18.0 - 32.0 * x + 12.0 * std::pow(x, 2.0) + 48.0 * y - + 36.0 * x * y + 27.0 * std::pow(y, 2.0))); +} + +TEST_CASE("goldstein_price(0, -1) = 3") +{ + REQUIRE(goldstein_price(0.0, -1.0) == Approx(3.0).margin(TOLERANCE)); +} + +inline double booth(double x, double y) +{ + return std::pow(x + 2.0 * y - 7.0, 2.0) + std::pow(2.0 * x + y - 5.0, 2.0); +} + +TEST_CASE("booth(1, 3) = 0") +{ + REQUIRE(booth(1.0, 3.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double bukin_n6(double x, double y) +{ + return 100.0 * std::sqrt(std::abs(y - 0.01 * std::pow(x, 2.0))) + + 0.01 * std::abs(x + 10.0); +} + +TEST_CASE("bukin_n6(-10, 1) = 0") +{ + REQUIRE(bukin_n6(-10.0, 1.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double matyas(double x, double y) +{ + return 0.26 * sphere(x, y) - 0.48 * x * y; +} + +TEST_CASE("matyas(0, 0) = 0") +{ + REQUIRE(matyas(0.0, 0.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double sin2(double x) +{ + return std::pow(std::sin(x), 2.0); +} + +inline double levi_n13(double x, double y) +{ + return sin2(3.0 * std::numbers::pi * x) + + std::pow(x - 1.0, 2.0) * (1.0 + sin2(3.0 * std::numbers::pi * y)) + + std::pow(y - 1.0, 2.0) * (1.0 + sin2(2.0 * std::numbers::pi * y)); +} + +TEST_CASE("levi_n13(1, 1) = 0") +{ + REQUIRE(levi_n13(1.0, 1.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double three_hump_camel(double x, double y) +{ + return 2.0 * std::pow(x, 2.0) - 1.05 * std::pow(x, 4.0) + + std::pow(x, 6.0) / 6.0 + x * y + std::pow(y, 2.0); +} + +TEST_CASE("three_hump_camel(0, 0) = 0") +{ + REQUIRE(three_hump_camel(0.0, 0.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double eggholder(double x, double y) +{ + return -(y + 47.0) * std::sin(std::sqrt(std::abs(x / 2.0 + (y + 47.0)))) - + x * std::sin(std::sqrt(std::abs(x - (y + 47.0)))); +} + +TEST_CASE("eggholder(512, 404.2319) = -959.6407") +{ + REQUIRE(eggholder(512.0, 404.2319) == Approx(-959.6407).margin(TOLERANCE)); +} + +inline double mccormick(double x, double y) +{ + return std::sin(x + y) + std::pow(x - y, 2.0) - 1.5 * x + 2.5 * y + 1.0; +} + +TEST_CASE("mccormick(-0.54719, -1.54719) = -1.9133") +{ + REQUIRE(mccormick(-0.54719, -1.54719) == Approx(-1.9133).margin(TOLERANCE)); +} + +inline double schaffer_n2(double x, double y) +{ + return 0.5 + (sin2(std::pow(x, 2.0) - std::pow(y, 2.0)) - 0.5) / + std::pow(1.0 + 0.001 * sphere(x, y), 2.0); +} + +TEST_CASE("schaffer_n2(0, 0) = 0") +{ + REQUIRE(schaffer_n2(0.0, 0.0) == Approx(0.0).margin(TOLERANCE)); +} + +inline double cos2(double x) +{ + return std::pow(std::cos(x), 2.0); +} + +inline double schaffer_n4(double x, double y) +{ + return 0.5 + + (cos2(std::sin(std::abs(std::pow(x, 2.0) - std::pow(y, 2.0)))) - + 0.5) / + std::pow(1.0 + 0.001 * sphere(x, y), 2.0); +} + +TEST_CASE("schaffer_n4(0, 1.25313) = 0.292579") +{ + REQUIRE(schaffer_n4(0.0, 1.25313) == Approx(0.292579).margin(TOLERANCE)); +} TEST_CASE("Should pass") { - std::cout << "HI" << std::endl; REQUIRE_NOTHROW(foo()); }