I like the idea of having this thread. It would be fun at some point to teach a workshop on this to get more people into working with the core of Stan.
Some issues I’ve noticed:
Lack of time (on our parts) to properly address design issues with potential contributions. It’s hard over email/github to sort them out and new contributors often don’t understand what our priorities are in terms of efficiency and maintainability. Sebastian and I both had the issue where we wrote a bunch of code while in communication with Daniel/Bob (not pointing fingers, you guys were just the ones willing to correspond over design issues) but in the end a lot of code hard to be re-written anyway due to misunderstandings. It would be nice to flesh out some of our priorities in a doc for new developers. The things I can think of are:
- most of the time is spent in auto-diff so maintainability/UI should often win over efficiency in non auto-diff code.
- maintainability is critical so don’t try to future-proof by adding indirection
3)… I forget, I think I’ve gotten used to the project so I lost perspective on these…
There are also some basic tasks that could use examples, for example:
- example of adding a function to stan-dev/math, I think we have this in some form
- example of exposing a function to stan-dev/stan
- example of adding a function to stan-dev/math, with analytic derivatives (In the next few weeks I want to add boost’s inverse gamma so I’ll try to track the process and produce a simple example).
- pointers to tests that demonstrate how to call the stan-dev/stan API for algorithms, these don’t necessarily need to be separate examples since the tests Dan and I wrote on the refactor branch are pretty clear. It would help to have some of the objects available.
- maybe a generated C++ file for a Stan model with commentary (possibly just in comments) to clear up the ‘model concept’ we’re using. This stuff didn’t really make sense to me until I tried to modify the code generator.
All these pieces make sense to me now but it used to look like a black art. I don’t think much of it really requires a deep understanding of C++, although writing a function with analytic gradients requires more than the rest.