Files
ensmallen/tests/aug_lagrangian_test.cpp
T
2019-08-31 19:29:44 +02:00

111 lines
3.1 KiB
C++

/**
* @file aug_lagrangian_test.cpp
* @author Ryan Curtin
* @author Marcus Edel
* @author Conrad Sanderson
*
* Test of the AugmentedLagrangian class using the test functions defined in
* aug_lagrangian_test_functions.hpp.
*
* ensmallen is free software; you may redistribute it and/or modify it under
* the terms of the 3-clause BSD license. You should have received a copy of
* the 3-clause BSD license along with ensmallen. If not, see
* http://www.opensource.org/licenses/BSD-3-Clause for more information.
*/
#include <ensmallen.hpp>
#include "catch.hpp"
using namespace ens;
using namespace ens::test;
/**
* Tests the Augmented Lagrangian optimizer using the
* AugmentedLagrangianTestFunction class.
*/
TEST_CASE("AugLagrangianTestFunctionTest", "[AugLagrangianTest]")
{
// The choice of 10 memory slots is arbitrary.
AugLagrangianTestFunction f;
AugLagrangian aug;
arma::vec coords = f.GetInitialPoint();
if (!aug.Optimize(f, coords))
FAIL("Optimization reported failure.");
double finalValue = f.Evaluate(coords);
REQUIRE(finalValue == Approx(70.0).epsilon(1e-7));
REQUIRE(coords(0) == Approx(1.0).epsilon(1e-7));
REQUIRE(coords(1) == Approx(4.0).epsilon(1e-7));
}
/**
* Tests the Augmented Lagrangian optimizer using the Gockenbach function.
*/
TEST_CASE("GockenbachFunctionTest", "[AugLagrangianTest]")
{
GockenbachFunction f;
AugLagrangian aug;
arma::mat coords = f.GetInitialPoint<arma::mat>();
if (!aug.Optimize(f, coords))
FAIL("Optimization reported failure.");
double finalValue = f.Evaluate(coords);
// Higher tolerance for smaller values.
REQUIRE(finalValue == Approx(29.633926).epsilon(1e-7));
REQUIRE(coords(0) == Approx(0.12288178).epsilon(1e-5));
REQUIRE(coords(1) == Approx(-1.10778185).epsilon(1e-7));
REQUIRE(coords(2) == Approx(0.015099932).epsilon(1e-5));
}
/**
* Tests the Augmented Lagrangian optimizer using the Gockenbach function. Uses
* arma::fmat.
*/
TEST_CASE("GockenbachFunctionFMatTest", "[AugLagrangianTest]")
{
GockenbachFunction f;
AugLagrangian aug;
arma::fmat coords = f.GetInitialPoint<arma::fmat>();
if (!aug.Optimize(f, coords))
FAIL("Optimization reported failure.");
float finalValue = f.Evaluate(coords);
// Higher tolerance for smaller values.
REQUIRE(finalValue == Approx(29.633926).epsilon(1e-3));
REQUIRE(coords(0) == Approx(0.12288178).epsilon(0.1));
REQUIRE(coords(1) == Approx(-1.10778185).epsilon(1e-3));
REQUIRE(coords(2) == Approx(0.015099932).epsilon(0.1));
}
/**
* Tests the Augmented Lagrangian optimizer using the Gockenbach function. Uses
* arma::sp_mat.
*/
TEST_CASE("GockenbachFunctionSpMatTest", "[AugLagrangianTest]")
{
GockenbachFunction f;
AugLagrangian aug;
arma::sp_mat coords = f.GetInitialPoint<arma::sp_mat>();
if (!aug.Optimize(f, coords))
FAIL("Optimization reported failure.");
double finalValue = f.Evaluate(coords);
// Higher tolerance for smaller values.
REQUIRE(finalValue == Approx(29.633926).epsilon(1e-7));
REQUIRE(coords(0) == Approx(0.12288178).epsilon(1e-5));
REQUIRE(coords(1) == Approx(-1.10778185).epsilon(1e-7));
REQUIRE(coords(2) == Approx(0.015099932).epsilon(1e-5));
}