Hi,
For an ABC model I’m trying to build I need the arctan2 output of a Tensor variable.
arctan
is implemented in pm.math, but not arctan2
, and so I tried implementing it myself using
a custom function with if
and else
statements. I then found out that Boolean operations are not allowed in pymc
- and the alternative is to use pm.math.switch
. as pointed out in this answer.
While trying to ‘convert’ arctan output to arctan2 output (using the if-else statements here), I’m not quite sure if the ‘switching’ in pm.math.switch would result in the same output as a set of order sensitive if
-s and else
-s. To clarify, here’s the standard Python code to convert from atan → atan2:
def custom_atan2(y,x):
'''
Based on https://en.wikipedia.org/wiki/Atan2
'''
if x>0:
return np.arctan(y/x)
elif y>0:
return np.pi/2 - np.arctan(x/y)
elif y<0:
return -np.pi/2 - np.arctan(x/y)
elif x<0:
return np.arctan(y/x) + np.pi
elif x==0 and y==0:
return np.nan
If I were to use pm.math.switch
, the order-sensitivity of the return statements would be lost (e.g. if x is not >0, then I don’t want to switch to the condition where x<0 already). Does anyone have workarounds to this, or maybe I’m not able to see something very obvious…?