blob: 8b52d2ff31c175c52b463ef82e3f32e68764bd9f [file] [log] [blame] [edit]
// RUN: %clang++ -std=c++11 -fno-exceptions -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
// RUN: %clang++ -std=c++11 -fno-exceptions -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -enzyme-inline=1 -S | %lli -
#include "../test_utils.h"
#include <cmath>
#include <vector>
using std::vector;
template <typename T> T rosenbrock2(const vector<T> &control) {
T result(0);
for (std::size_t i = 0; i < control.size(); i += 2) {
T c1 = (control[i + 1] - control[i] * control[i]);
T c2 = 1.0 - control[i];
result += 100 * c1 * c1 + c2 * c2;
}
return result;
};
extern double __enzyme_fwddiff(double (*)(const vector<double> &),
vector<double> &, vector<double> &);
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) {
using S = double;
vector<S> control{1.5, 2.5, 3.5, 4.5};
vector<S> results{-149.000000, 50.000000, 10855.000000, -1550.000000};
for (size_t i = 0; i < control.size(); i++) {
vector<S> activity(4);
activity[i] = 1.0;
double dret = __enzyme_fwddiff(rosenbrock2<S>, control, activity);
APPROX_EQ(results[i], dret, 1e-10)
}
return 0;
}