| // 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; |
| } |