I have an MCMC problem that requires calls to a python function that employs a zero-finder internally. It’s throwing errors that I’m not sure how to diagnose (I’m new to Theano)… any pointers greatly appreciated!
import pymc3 as pm
import cbsyst as cb # the package I'm calling - for calculating seawater carbon chemistry.
# example problem: what DIC is consistent with an observed pCO2 and TA
obs_pCO2 = 433.5
TA = 2400
with pm.Model() as m:
DIC = pm.Normal('DIC', 2000, 200)
mu = cb.Csys(DIC=DIC, TA=TA).pCO2
sigma = pm.Exponential('sigma', 1)
pCO2 = pm.Normal('pCO2', mu, sigma, observed=obs_pCO2)
pm.sample()
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-18-49e7ddbb65c4> in <module>
3 DIC = pm.Normal('DIC', 2000, 200)
4
----> 5 mu = cb.Csys(DIC=DIC, TA=TA).pCO2
6 sigma = pm.Exponential('sigma', 1)
7
~/GitHub/cbsyst/cbsyst/cbsyst.py in Csys(pHtot, DIC, CO2, HCO3, CO3, TA, fCO2, pCO2, BT, Ca, Mg, T_in, S_in, P_in, T_out, S_out, P_out, TP, TSi, pHsws, pHfree, pHNBS, Ks, pdict, unit)
224 fCO2=ps.fCO2, pCO2=ps.pCO2,
225 T_in=ps.T_in, BT=ps.BT, TP=ps.TP, TSi=ps.TSi,
--> 226 TS=ps.TS, TF=ps.TF, Ks=ps.Ks))
227
228 # calculate pHs on all scales, if not done before.
~/GitHub/cbsyst/cbsyst/carbon_fns.py in calc_C_species(pHtot, DIC, CO2, HCO3, CO3, TA, fCO2, pCO2, T_in, BT, TP, TSi, TS, TF, Ks)
607 TS=TS,
608 TF=TF,
--> 609 Ks=Ks)
610 H = ch(pHtot)
611
~/GitHub/cbsyst/cbsyst/carbon_fns.py in TA_DIC(TA, DIC, BT, TP, TSi, TS, TF, Ks)
342
343 while any(abs(deltapH) > 1):
--> 344 deltapH[abs(deltapH) > 1] /= 2
345
346 pHx += deltapH
~/miniconda3/envs/py3/lib/python3.7/site-packages/theano/tensor/var.py in __getitem__(self, args)
556
557 if advanced_boolean:
--> 558 return theano.tensor.subtensor.advanced_boolean_subtensor(self, *args)
559 elif advanced:
560 if (axis is not None and
~/miniconda3/envs/py3/lib/python3.7/site-packages/theano/gof/op.py in __call__(self, *inputs, **kwargs)
613 """
614 return_list = kwargs.pop('return_list', False)
--> 615 node = self.make_node(*inputs, **kwargs)
616
617 if config.compute_test_value != 'off':
~/miniconda3/envs/py3/lib/python3.7/site-packages/theano/tensor/subtensor.py in make_node(self, x, *index)
2177
2178 index = tuple(map(as_index_variable, index))
-> 2179 bcast = adv_index_broadcastable_pattern(x, index)
2180 return gof.Apply(self,
2181 (x,) + index,
~/miniconda3/envs/py3/lib/python3.7/site-packages/theano/tensor/subtensor.py in adv_index_broadcastable_pattern(a, idx)
2114 # 2 - True = 1; 2 - False = 2
2115 fakeshape = [2 - bc for bc in a.broadcastable]
-> 2116 retshape = np.empty(fakeshape)[newidx].shape
2117 return tuple([dim == 1 for dim in retshape])
2118
IndexError: boolean index did not match indexed array along dimension 0; dimension is 1 but corresponding boolean dimension is 2
The error is definitely coming from inside the zero-finder part of the function. I’m open to modifying the zero-finder to work with Theano… but is this even possible? At this stage I’m just looking for some friendly pointers before spending a whole lot of time trying going down blind alleys!