HI All,
I’m trying to estimate how much a mic array has been shifted using experimental measurements. Modelling the measured mic-to-mic distances for a few of the mics in the whole array - I try to check how much each mic is shifted from to match the measurements.
The problem I have is that the pm.draw works fine and generates dimensionally consistent outputs. The moment I try to pm.sample however - I get the following Error:
TypeError: Real.grad illegally returned an integer-valued variable. (Input index 0, dtype complex128)
This is the simplest reproducible example below:
import pymc as pm
import pytensor as pt
def calc_distance_to(focalmic, mic_array):
'''
'''
diff = mic_array - focalmic
norm_dist = pm.math.abs(pt.tensor.linalg.norm(diff, axis=1))
return norm_dist
full_array = np.random.normal(0,10,16*3).reshape(16,3)
micnums_inds = [0,8,15] # subset only these mics each time.
full_mic_rows = np.random.normal(0,0.1,3*16).reshape(3,16)
with pm.Model() as dev_model:
ideal_micarray = pm.Data('ideal', full_array)
focal_mics = pm.Data('focal_mics', micnums_inds)
obs_micdists = pm.Data('obs_micdists', full_mic_rows)
mean_shifts = pm.Normal('mean_shifts', 0, 0.1, shape=(full_array.shape[0],
full_array.shape[1]))
sd = pm.HalfNormal('sd', 0.1)
shift = pm.Normal('shift', mu=mean_shifts, sigma=sd)
shifted_mics = pm.Deterministic('shifted_mics', ideal_micarray + shift)
focal_micxyz = pm.Deterministic('focal_micxyz', shifted_mics[focal_mics])
mic2mic_dists = pm.Deterministic('mic2mic_dists', pt.scan(fn=calc_distance_to,
sequences=focal_micxyz,
non_sequences=shifted_mics, return_updates=False))
pred_sd = pm.HalfNormal('pred_sd', 0.3)
observed_mismatch = pm.Normal('observed_mismatch', mu=mic2mic_dists,
sigma=pred_sd,
observed=obs_micdists)
idata = pm.sample()
Any help or pointers would be greatly appreciated.
Using the following environment:
Python 3.11.0
Pymc 6.0.1
Pytensor 3.0.4
OS: Windows 10