You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.2 KiB
49 lines
1.2 KiB
#include <Eigen/Core>
|
|
#include <catch2/catch.hpp>
|
|
|
|
#include <finitediff.hpp>
|
|
|
|
#include <barrier/barrier.hpp>
|
|
#include <utils/eigen_ext.hpp>
|
|
|
|
using namespace ipc;
|
|
using namespace ipc::rigid;
|
|
|
|
TEST_CASE("Test barriers and their derivatives", "[opt][barrier]")
|
|
{
|
|
double s = GENERATE(range(-5, 2));
|
|
s = pow(10, s);
|
|
|
|
BarrierType barrier_type =
|
|
GENERATE(BarrierType::IPC, BarrierType::POLY_LOG, BarrierType::SPLINE);
|
|
|
|
double x = GENERATE_COPY(take(10, random(s / 2, 0.9 * s))); // ∈ [0, s]
|
|
Vector1d x_vec;
|
|
x_vec << x;
|
|
|
|
Eigen::VectorXd fgrad(1);
|
|
fd::finite_gradient(
|
|
x_vec,
|
|
[&](const Eigen::VectorXd& x) {
|
|
return barrier(x[0], s, barrier_type);
|
|
},
|
|
fgrad);
|
|
|
|
Eigen::VectorXd grad(1);
|
|
grad << barrier_gradient(x, s, barrier_type);
|
|
|
|
CAPTURE(barrier_type, s, x, fgrad(0), grad(0));
|
|
CHECK(fd::compare_gradient(fgrad, grad));
|
|
|
|
fd::finite_gradient(
|
|
x_vec,
|
|
[&](const Eigen::VectorXd& x) {
|
|
return barrier_gradient(x[0], s, barrier_type);
|
|
},
|
|
fgrad);
|
|
|
|
grad << barrier_hessian(x, s, barrier_type);
|
|
|
|
CAPTURE(barrier_type, s, x, fgrad(0), grad(0));
|
|
CHECK(fd::compare_gradient(fgrad, grad));
|
|
}
|
|
|