-
-
Notifications
You must be signed in to change notification settings - Fork 189
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add vectorized variant for functions of complex variable, especially exp #3138
Comments
I agree we should support these! But, I also wanted to clear up a possible misconception:
In many cases, this is exactly what the elementwise versions of the functions for reals are doing, e.g. math/stan/math/prim/fun/exp.hpp Lines 70 to 73 in 42d94c4
(where This is different from e.g. the distribution functions which are vectorized, which are written to share intermediate results and autodiff memory between different elements. There are also a few exceptions to this (usually around the "struct of arrays" optimization), but in general you shouldn't fear writing your own for-loop-based helper functions for these until they are supported directly in the language. |
On the C++ side, I don't believe there is anything specific about complex types when it comes to Are there complex functions that are missing from the Math library, or is this just an issue for stanc3 to expose the signatures? |
Generally yes, though sometimes all that's needed is loosening an existing template bound |
Another complex-variable function that apparently isn't vectorized but definitely should be is |
Currently, according to the guide https://mc-stan.org/docs/functions-reference/complex-valued_basic_functions.html it seems that basic arithmetic operators and
pow
are the only functions that accept complex vectors.I am modelling some periodicities in data using Fourier series, and I find it the most compact (and computationally efficient) to express what I do in terms of complex numbers. However, it's not efficient to run a function over a matrix using a loop when there's autodiff.
The most striking case is the
exp
function, which is ubiquitous in complex analysis and I want to be able to run it elementwise over a vector or a matrix.I figured out a possible workaround is to use
pow(exp(1), z)
which does work on vectorizedz
, but still I believe thatexp
is more fundamental thanpow
and it should be implemented, because the current state is confusing at best.Of course then there are all the other functions which accept a real or complex scalar and accept vectorized real, but don't accept vectorized complex, which is inconsistent. This includes
log
and the trigonometric functions.The text was updated successfully, but these errors were encountered: