On Thu, Jun 14, 2012 at 5:53 PM, Nathaniel Smith <n...@pobox.com> wrote:
> On Thu, Jun 14, 2012 at 9:22 PM, srean <srean.l...@gmail.com> wrote:
> No, I'm saying I totally see the advantages. Here's the code I'm talking 
> about:
>
>    def _loglik(self, params):
>        alpha, beta = self.used_alpha_beta(params)
>        if np.any(alpha < 0):
>            return 1e20
>        total = 0
>        for group in self._model._groups.itervalues():
>            alpha_part = np.dot(group["alpha_matrix"], alpha)
>            eff_beta_matrix = group["beta_matrix"].copy()
>            nab = self._model._num_alpha_betas
>            eff_beta_matrix[:, :nab] *= np.log(alpha_part[:, np.newaxis])
>            exponent = np.dot(eff_beta_matrix, beta)
>            Z = np.exp(exponent).sum()
>            total += (group["counts"] * exponent).sum()
>            total += group["counts"].sum() * -np.log(Z)
>        return total
>

You're right, this is totally the kind of code that autodiff
can/should be able to help with.

I just pushed a first draft at support for np.any, log, exp, inplace
operators, and inplace array assignment... so there's a chance that
your example might currently run. (You might even see a speedup if
Theano graph optimizations work their magic). It's not clear from the
code fragment what the various types in play are (see previous rant on
static analysis!), but an autodiff PR with a test case would help sort
out any remaining problems if you want to follow up on this.

- James
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to