# Operands and partials with more than five edges

#1

Hi all,

I’m working on some code for an efficient (lme4-like) linear mixed model for the Stan library. I’m piggybacking quite heavily off `normal_id_glm_lpdf.hpp`.

I’ve got most of the details worked out, although it’s got a few complications (mainly due to Eigen’s limited sparse matrix features).

But my main problem right now is that I have 8 potential autodiff parameters (5 vector-like parameters, 2 dense matrix-like parameters, and one scalar parameter), which is more than the five assumed by the implementation of `operands_and_partials`. Is there an obvious way to get around this?

• In almost every application, at most three of these will be vars, but following convention, I’m making sure every `double` can be a `var`.
• I’m assuming the `ops_partials.edge1_.partials_` syntax is correct rather than the `operands_and_partials_d_x1_` syntax from the arXiv paper on the math library. Please let me know if that’s wrong.

Edit: I’m probably going to hit similar road blocks with the traits meta-programs. Let me know if the solution is different here.
Edit 2: Actually, would this work for the metaprograms?

``````return_type<T1, T2, return_type<T3,T4>::type >::type
``````

Thanks!

Dan

#2

Probably the easiest solution is just to add more template arguments to operands and partials? It’s probably just some copy paste.

Here are the files!

``````bbales2@tadpole:~/math-1d\$ find stan/math -name "operands_and_partials*"
stan/math/rev/mat/meta/operands_and_partials.hpp
stan/math/rev/scal/meta/operands_and_partials.hpp
stan/math/fwd/mat/meta/operands_and_partials.hpp
stan/math/fwd/scal/meta/operands_and_partials.hpp
stan/math/prim/mat/meta/operands_and_partials.hpp
stan/math/prim/scal/meta/operands_and_partials.hpp
``````

This is what happens to the edge1_.partials in the end `https://github.com/stan-dev/math/blob/develop/stan/math/rev/scal/meta/operands_and_partials.hpp#L113`

I think @seantalts would have the most precise answers on this.

This is the same as `return_type<T1, T2, T3,T4>::type`, right? Was that template meta-program not accepting enough arguments? If so it’d be worth an issue and should be an easy fix.

#3

We only have 5 because when we only needed 4, Matthijs went and made some of these GLM functions that needed 5 so he expanded it. You should be able to find a PR with that in it and copy it (I can look a bit later tonight). I don’t think there’s a reason not to expand it further.

#4

Easy! Thanks.

#5

Right. I found the PR Feature/Normal_Id_GLM #665. There’s nothing in the `operands_and_partials` bit that’s particularly intimidating, so I’ll do that and when I eventually get everything else running I’ll make a PR.