python - Decorators in PyMC -
i have 3 question regarding decorators not able find answer :
q1)what arguments decorators in pymc (@deterministic, @stochastic) denote ?
q2)
@pymc.stochastic(dtype=int) def switchpoint(value=10, t_l=0, t_h=110): def logp(value, t_l, t_h): if value > t_h or value < t_l: return -np.inf else: return -np.log(t_h - t_l + 1) def random(t_l, t_h): numpy.random import random return np.round( (t_l - t_h) * random() ) + t_l
1)print switchpoint.logp #prints log-probability expected
2)print switchpoint.random #does not generate random number
3)print switchpoint.random() # generates random number
4)print switchpoint.logp() #error
if 2 did not work , 3 worked 1 should not have worked , instaed 4 should have worked (which opposite of observed). can explain going on ?
q3)
@pymc.stochastic(dtype=int) def switchpoint(value=1900, t_l=1851, t_h=1962): if value > t_h or value < t_l: # invalid values return -np.inf else: # uniform log-likelihood return -np.log(t_h - t_l + 1)
here not specified logp
still if type switchpoint.logp
, piece of code executed ?
q1) meaning of arguments stochastic documented here. arguments deterministic same, plus additional ones documented here.
q2) difference in behavior there magic inside pymc executes switchpoint.logp
function , turns python property
, while switchpoint.random
doesn't treatment, , kept function.
if you're curious what's going on, here's of relevant source:
def get_logp(self): if self.verbose > 1: print '\t' + self.__name__ + ': log-probability accessed.' logp = self._logp.get() if self.verbose > 1: print '\t' + self.__name__ + ': returning log-probability ', logp try: logp = float(logp) except: raise typeerror, self.__name__ + ': computed log-probability ' + str(logp) + ' cannot cast float' if logp != logp: raise valueerror, self.__name__ + ': computed log-probability nan' # check if value smaller double precision infinity: if logp <= d_neg_inf: if self.verbose > 0: raise zeroprobability, self.errmsg + ": %s" %self._parents.value else: raise zeroprobability, self.errmsg return logp def set_logp(self,value): raise attributeerror, 'potential '+self.__name__+'\'s log-probability cannot set.' logp = property(fget = get_logp, fset=set_logp, doc="self's log-probability value conditional on parents.")
there's other stuff going on there, during logp
function called lazyfunction
, that's basic idea.
q3) stochastic
decorator has (more) magic in uses code introspection determine if random
, logp
sub functions defined inside switchpoint
. if are, uses logp
sub-function compute logp
, if not, uses switchpoint
itself. source code here:
# gets used stochastic check long-format logp , random: if probe: # define global tracing function (i assume debugging??) # no, it's out logp , random functions, if they're in there. def probefunc(frame, event, arg): if event == 'return': locals = frame.f_locals kwds.update(dict((k,locals.get(k)) k in keys)) sys.settrace(none) return probefunc sys.settrace(probefunc) # functions logp , random (complete interface). # disable special methods prevent formation of hurricane of deterministics cur_status = check_special_methods() disable_special_methods() try: __func__() except: if 'logp' in keys: kwds['logp']=__func__ else: kwds['eval'] =__func__ # reenable special methods. if cur_status: enable_special_methods() key in keys: if not kwds.has_key(key): kwds[key] = none key in ['logp', 'eval']: if key in keys: if kwds[key] none: kwds[key] = __func__
again, there's more stuff going on, , it's complicated, that's basic idea.
Comments
Post a Comment