Anglican: A Probabilistic Programming System
probprog.github.io
probprog.github.io
Clojure was chosen because it was a modern lisp which was apparently easy to deploy (leveraging the JVM). That choice was given to me (I learned Clojure to join, but new Common Lisp well before). Original Anglican syntax was Scheme-like, for Church compatibility, but we switched to Clojure syntax later.
Anglican has been a platform for a number of research projects (and some practical applications). Now Anglican is in dire need of new maintainers or it will stagnate (I am not working on Anglican code base anymore, doing other things: http://infergo.org among others). One low-hanging fruit which unfortunately refuses to fall is automatic differentiation.
btw, Python programmers have the option of pymc3 https://docs.pymc.io/
At first glance, maybe Common Lisp would have made more sense. As far as I'm aware, the CFFI is pretty good, which means you can interact with other machine learning code that is largely written in C under the hood.
That said, there is a mature machine learning ecosystem for the JVM, not to mention the prospect of running massive probabilistic models on Yarn or Spark.
By the way, there are many probabilistic programming languages in addition to PyMC3. There are Stan, Edward, Pyro (fairly new), and even the venerable BUGS/JAGS.
It probably came down to a coin flip.
Also there is some tradition on using lisps for AI; church, for example, is implemented on top of scheme.
Other probabilistic programming languages use prolog as ascendent and Prolog and lisps such as clojure are quite related.
But I don’t know if these were the reasons :)
It is particularly strong when you want to build a data processing/analysis pipeline for moderate amounts of data (say, below a TB). With the fantastic built-in concurrency support, small external tools (core.async parallel pipelines and perhaps aphyr/tesser for parallel reducers) and the performance of the JVM, you can crunch through these amounts of data on a laptop, without involving anything bigger like hadoop. Saves time and makes for good consulting margins (I speak from experience).
It also happens to be the language which I use to develop fairly large applications, so I guess you could call me biased :-)
An important design feature is that it is 'anti-DSL' --- the syntax is exactly the Clojure syntax. But the program is transformed into an extended CPS form and run through inference executor. There is an academic paper written by Anglican team explaining the design and internals:
> An important design feature is that it is 'anti-DSL' --- the syntax is exactly the Clojure syntax.
This is not "anti-DSL", this is what gives Anglican embedded DSL qualities.
And yet there are limitations: «The border between Clojure and Anglican is subtle and usually will pose no problem to most programmers, however, some confusion can arise from the fact that Anglican programs are macro compiled into CPS-style Clojure functions. This means that some wrapping of “native” Clojure functions needs to happen in order to use them in Anglican. Errors arising due to misunderstanding this boundary crop up in the form of “wrong number of argument” exceptions».
Would that language border, wrapping of functions and transformation to CPS be still necessary in a language with native support for continuations?
A language with native support of continuations is a nice toy but does not bring practical benefits to implementing CPS state monad.
As most language decisions for new projects, it probably came down to "it's their favorite language".
> btw, Python programmers have the option of pymc3 https://docs.pymc.io/
And Edward (http://edwardlib.org/), "Pyro" (http://pyro.ai/) and "ProbTorch" (https://github.com/probtorch/probtorch).
The first built on TensorFlow, the latter two on PyTorch.
Stan (http://mc-stan.org/) also has python bindings: https://pystan.readthedocs.io/en/latest/
(edit: maybe not? The good reverend was not CofE)