EnzymeAD / EnzymeAD/Enzyme

Emit C++ Warning if "Activating" constant arguments

Open
#2,396 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
LLVM
Stars
1.7k
Forks
188
Avg merge
1d 22h
Merged PRs (30d)
26

Description

Passing an argument as constant but then introducing it into the differentiated path does not emit a warning in C++.

@wsmoses mentioned today there are warnings in Julia for this common error pattern, it would be nice to warn also in C++ compilation.

Wrong usage: https://fwd.gymni.ch/S07AKJ warning wanted :)

C++ code

```C++
#include
#include

inline int enzyme_dup;
inline int enzyme_dupnoneed;
inline int enzyme_in;
inline int enzyme_out;
inline int enzyme_const;

struct S {
S(double r) : x(r) {};
double x = 0.0;
};

extern double __enzyme_fwddiff(void*, int, std::list&, int, ...);
//extern double __enzyme_autodiff(void*, int, std::list&, int, ...);

double test_modify_list(std::list & vals, double const & x) {
// simplified function for comparison:
//return x*x;
// what we want to do
vals.front().x = x;

// iterate over list
double result = 0.0;
for (const auto& val : vals) {
result += val.x * val.x;
}
return result;
}

int main ()
{
std::list vals = {S{1.0}, S{2.0}, S{3.0}};
double x = 3.0;
double dx = 1.0;

double ret = __enzyme_fwddiff((void*)test_modify_list, enzyme_const, vals, enzyme_dup, &x, &dx);
// FIXME: ret is 0 instead of 6
std::cout << "FW test_modify_list ret=" << ret << " x=" << x << " dx=" << dx << "\n";
}
```

Correct example: https://fwd.gymni.ch/cJlqgX

C++ code

```C++
#include
#include

inline int enzyme_dup;
inline int enzyme_dupnoneed;
inline int enzyme_in;
inline int enzyme_out;
inline int enzyme_const;

struct S {
S(double r) : x(r) {};
double x = 0.0;
};

extern double __enzyme_fwddiff(void*, int, std::list&, std::list&, int, ...);
//extern double __enzyme_autodiff(void*, int, std::list&, int, ...);

double test_modify_list(std::list & vals, double const & x) {
// simplified function for comparison:
//return x*x;
// what we want to do
vals.front().x = x;

// iterate over list
double result = 0.0;
for (const auto& val : vals) {
result += val.x * val.x;
}
return result;
}

int main ()
{
std::list vals = {S{1.0}, S{2.0}, S{3.0}};
std::list dvals = {S{0.0}, S{0.0}, S{0.0}};
double x = 3.0;
double dx = 1.0;

double ret = __enzyme_fwddiff((void*)test_modify_list, enzyme_dup, vals, dvals, enzyme_dup, &x, &dx);
// FIXME: ret is 0 instead of 6
std::cout << "FW test_modify_list ret=" << ret << " x=" << x << " dx=" << dx << "\n";
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.