<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Turing.jl</title>
<link>https://turinglang.org/news/</link>
<atom:link href="https://turinglang.org/news/index.xml" rel="self" type="application/rss+xml"/>
<description>Turing.jl is a probabilistic programming language and Bayesian modelling framework for the Julia programming language.</description>
<image>
<url>https://turinglang.org/assets/logo/turing-text-logo.jpg</url>
<title>Turing.jl</title>
<link>https://turinglang.org/news/</link>
</image>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Sat, 01 Aug 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Turing.jl Newsletter 19</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2026-07-15-newsletter-19/</link>
  <description><![CDATA[ 





<p>It’s been a few months since the last newsletter. Several updates have been released across the packages since then, and there is some work outside the Julia packages to share as well.</p>
<p><strong>A new AD interface in AbstractPPL</strong></p>
<p>Most of our time went into reorganising how automatic differentiation works. It now goes through a small interface in AbstractPPL, rather than each package calling DifferentiationInterface (DI) directly. ForwardDiff and Mooncake get native paths, and everything else still goes through DI.</p>
<ul>
<li><strong>AbstractPPL@0.15</strong> adds the <a href="https://turinglang.org/AbstractPPL.jl/stable/evaluators/">prepared-evaluator interface</a>, and fixes a Mooncake reverse-mode correctness bug (<a href="https://github.com/chalk-lab/Mooncake.jl/issues/1238">#1238</a>).</li>
<li><strong>DynamicPPL@0.42</strong> moves onto this interface and drops DI as a hard dependency, so DI-routed backends such as ReverseDiff now need <code>using DifferentiationInterface</code> (<a href="https://github.com/TuringLang/DynamicPPL.jl/releases/tag/v0.42.0">changelog</a>).</li>
<li><strong>Bijectors@0.16</strong> moves ChainRulesCore and EnzymeCore to weak dependencies.</li>
<li><strong>AdvancedVI@0.7</strong> follows suit. <code>AutoReverseDiff(; compile=true)</code> is no longer accepted for VI (<a href="https://github.com/TuringLang/AdvancedVI.jl/releases/tag/v0.7.0">changelog</a>).</li>
<li><strong>Turing@0.46</strong> brings this together (<a href="https://github.com/TuringLang/Turing.jl/releases/tag/v0.46.0">changelog</a>).</li>
</ul>
<p><strong>DoodleBUGS is now DoodlePPL</strong></p>
<p>DoodleBUGS has a new name. It’s now DoodlePPL, and you can <a href="https://turinglang.org/JuliaBUGS.jl/DoodlePPL/">try it here</a>. It generates Stan code from a graph now, as well as BUGS and JuliaBUGS, and you can <a href="https://turinglang.org/JuliaBUGS.jl/DoodlePPL/DoodleWidget/">embed it in any page</a> as a web component.</p>
<p><strong>MCMC.js</strong></p>
<p>The editor is developed in <a href="https://github.com/mcmcjs/mcmcjs">MCMC.js</a> (<code>npm i -g mcmcjs</code>), a set of TypeScript command-line tools for running and diagnosing Bayesian models across Turing.jl, JuliaBUGS, and Stan. It’s early alpha and the CLI isn’t stable yet, so do have a play with it, but don’t build anything important on it just yet.</p>
<p>As always we’re a small team with a long to-do list, so if any of this is useful, or if you hit rough edges, do get in touch!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2026-07-15-newsletter-19/</guid>
  <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 18</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2026-03-09-newsletter-18/</link>
  <description><![CDATA[ 





<p>Just to get it out of the way: I’m going to drop the pretense that the newsletters are regular; we’ll move to an ad hoc schedule, basically I’ll post when there’s something interesting to talk about. This will hopefully be monthly-ish (but no promises).</p>
<p>That said, this time there are plenty of interesting stuff! We’ve rewritten quite a lot of things from scratch and now released them.</p>
<ul>
<li><p><em>AbstractPPL@0.14</em> has <a href="https://turinglang.org/AbstractPPL.jl/stable/varname/">a completely new VarName data structure</a>. The high-level interface is still the same <code>@varname(x[a].b)</code> but you can now represent richer variable names, most notably <code>begin</code> and <code>end</code> indices, as well as keyword indices.</p></li>
<li><p><em>Bijectors@0.15.17</em> has <a href="https://turinglang.org/Bijectors.jl/stable/vector/">a new interface for converting samples from distributions to/from vectors</a>. This is a slightly less pretty interface than the old Bijectors interface (which still exists), but is more tailored towards Turing’s needs and as a result you’ll get a nice performance boost from it (<a href="https://github.com/TuringLang/DynamicPPL.jl/pull/1303">some benchmarks here</a>), as well as fixing a number of bugs with unusual product distributions and LKJCholesky. This is bundled into the latest Turing release, no need to do anything on your end.</p></li>
<li><p><em>DynamicPPL@0.40</em> is the one we’ve been going on about for a while now: VarInfo and its internal data structures have been completely reworked. You mostly get better performance from this, but also a much richer representation of random variables and their values. I can’t do it justice here, please see <a href="https://github.com/TuringLang/DynamicPPL.jl/releases/tag/v0.40.0">the full changelog</a> for details!</p></li>
<li><p><em>Turing@0.43</em> essentially brings all of that together into your favourite probprog framework. On top of all of the above, the optimisation interface has also been completely rewritten; it’s now more high-level and the inputs and outputs will be easier to work with (<a href="https://turinglang.org/docs/usage/mode-estimation/">see the new version’s docs for more info</a>).</p></li>
</ul>
<p>In recent versions of Turing one of the major focuses has been performance optimisations. I’m therefore very pleased to report now that running a couple of benchmarks on the eight-schools models, we find now that Turing + Mooncake/Enzyme has equivalent or better performance to Stan (<a href="https://gist.github.com/penelopeysm/5656697ea20c94d80a285f5f6a69b8ab">code is here</a>; do note that these aren’t very scientific!).</p>
<p>Moving forward, on top of core improvements to DynamicPPL we’re also keen to look into other ways to interact with Turing instead of just via the Julia REPL, such as a CLI, or possibly even tools for coding agents. We are quite limited by the number of people on the project (which is too low), but if you’d be interested in that or have an idea or use case do get in touch!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2026-03-09-newsletter-18/</guid>
  <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Google Summer of Code 2026</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2026-02-21-gsoc/</link>
  <description><![CDATA[ 





<p>The TuringLang ecosystem has made strong progress recently: more AD backends, a maturing JuliaBUGS, and clearer inference tooling.</p>
<p>For GSoC 2026 we offer projects from core AD work to scalable inference and user-facing tools.</p>
<p>If a project interests you, contact the mentors listed below or open a discussion on the relevant GitHub repo. Please drop a short introduction message in the <a href="https://julialang.slack.com/archives/CCYDC34A0"><code>#turing</code></a> channel on the <a href="https://julialang.org/slack/">Julia Slack</a> and feel free to ping <a href="https://github.com/shravanngoswamii">Shravan Goswami</a> there. Mentors will be happy to discuss project details, scope, and expectations, and you can find mentor contacts at <a href="../../../team/">team page</a>.</p>
<p>Also cross-posted on <a href="https://julialang.org/jsoc/gsoc/turing/">Julia’s GSoC page</a>.</p>
<section id="mentor-contacts-on-julia-slack" class="level2">
<h2 class="anchored" data-anchor-id="mentor-contacts-on-julia-slack">Mentor Contacts on Julia Slack</h2>
<table class="caption-top table">
<thead>
<tr class="header">
<th>Mentor</th>
<th>Slack Contact</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Hong Ge</td>
<td><a href="https://julialang.slack.com/team/UCRDHV7PB">Slack</a></td>
</tr>
<tr class="even">
<td>Xianda Sun</td>
<td><a href="https://julialang.slack.com/team/U03AV5JMJ8N">Slack</a></td>
</tr>
</tbody>
</table>
</section>
<section id="new-abstractmcmc-based-gibbs-sampler-for-turing.jl-and-juliabugs.jl" class="level2">
<h2 class="anchored" data-anchor-id="new-abstractmcmc-based-gibbs-sampler-for-turing.jl-and-juliabugs.jl">New AbstractMCMC-based Gibbs Sampler for Turing.jl and JuliaBUGS.jl</h2>
<p><strong>Mentors</strong>: <a href="https://github.com/yebai">Hong Ge</a> and <a href="https://github.com/sunxd3">Xianda Sun</a></p>
<p><strong>Project difficulty</strong>: Medium</p>
<p><strong>Project length</strong>: 350 hrs</p>
<p>Gibbs sampling is one of the most widely used inference strategies in Bayesian computation, but Turing.jl’s current Gibbs implementation is tightly coupled to its internals and difficult to extend.</p>
<p>This project is about designing a clean, composable Gibbs sampler built on top of the <a href="https://github.com/TuringLang/AbstractMCMC.jl">AbstractMCMC.jl</a> interface so that it works perfectly across both Turing.jl and <a href="https://github.com/TuringLang/JuliaBUGS.jl">JuliaBUGS.jl</a>. Work will include:</p>
<ul>
<li>Agreeing on a minimal AbstractMCMC-compatible interface for conditional samplers.</li>
<li>Implementing the new Gibbs combinator and verifying correctness on standard models.</li>
<li>Migrating existing Turing.jl Gibbs usage to the new interface.</li>
<li>Ensuring JuliaBUGS.jl can plug in its own conditional samplers without modification.</li>
</ul>
</section>
<section id="stateful-hand-written-rules-and-thread-support-in-mooncake.jl" class="level2">
<h2 class="anchored" data-anchor-id="stateful-hand-written-rules-and-thread-support-in-mooncake.jl">Stateful Hand-Written Rules and Thread Support in Mooncake.jl</h2>
<p><strong>Mentors</strong>: <a href="https://github.com/yebai">Hong Ge</a> and <a href="https://github.com/sunxd3">Xianda Sun</a></p>
<p><strong>Project difficulty</strong>: Medium to Hard</p>
<p><strong>Project length</strong>: 350 hrs</p>
<p><a href="https://github.com/chalk-lab/Mooncake.jl">Mooncake.jl</a> is a source-to-source reverse-mode AD package for Julia. Two open issues currently limit its performance and applicability in real-world workloads.</p>
<p>The first is that every hand-written <code>rrule!!</code> must allocate scratch memory on every call (<a href="https://github.com/chalk-lab/Mooncake.jl/issues/403">issue #403</a>). Derived rules already avoid this by carrying persistent state between calls, but hand-written rules have no such mechanism. The fix is a <code>StatefulRRule</code> struct that holds a <code>Stack</code> of saved state, constructed via a <code>build_primitive_rrule</code> function. Rule authors implement <code>stateful_rrule!!</code>, which receives the current state (or <code>nothing</code> on the first call) and returns updated state alongside the usual outputs – stack push/pop is handled automatically. The work is to (1) add a test that fails when a primal is allocation-free but its <code>rrule!!</code> is not, (2) audit all existing hand-written rules with that test, and (3) convert the offenders.</p>
<p>The second is that Mooncake currently errors on any code using <code>Threads.@threads</code> (<a href="https://github.com/chalk-lab/Mooncake.jl/issues/570">issue #570</a>). Even a race-condition-free primal can produce race conditions on the reverse pass – two threads may concurrently increment the same tangent element, so increments must be atomic. Additionally, rule caches (the stacks inside <code>OpaqueClosure</code>s) must be Task-specific; sharing them across Tasks causes pushes and pops to interleave incorrectly. The work involves writing rules for the <code>ccall</code>s that enter and exit threaded regions, ensuring atomic tangent updates, and making rule caches Task-local without relying on <code>threadid()</code>.</p>
</section>
<section id="pigeons.jl-integration-with-turing-and-juliabugs-via-abstractmcmc" class="level2">
<h2 class="anchored" data-anchor-id="pigeons.jl-integration-with-turing-and-juliabugs-via-abstractmcmc">Pigeons.jl Integration with Turing and JuliaBUGS via AbstractMCMC</h2>
<p><strong>Mentors</strong>: <a href="https://github.com/sunxd3">Xianda Sun</a></p>
<p><strong>Project difficulty</strong>: Medium to Hard</p>
<p><strong>Project length</strong>: 350 hrs</p>
<p><a href="https://github.com/Julia-Tempering/Pigeons.jl">Pigeons.jl</a> implements parallel tempering and related algorithms that are particularly effective for multimodal and high-dimensional posteriors. This project has two related goals that together make Pigeons a first-class citizen of the TuringLang ecosystem.</p>
<p>The first part is documentation and examples. Turing.jl models can already be used as targets for Pigeons, but the combination is under-documented. The contributor will produce reproducible tutorials that walk through common use cases – multimodal posteriors, hierarchical models, models with difficult geometry – and compare Pigeons against HMC/NUTS on the same problems. These will be published on the Turing website and any integration rough edges found along the way will be fixed.</p>
<p>The second part is implementing the efficient Gibbs sampler from <a href="https://arxiv.org/abs/2410.03630">arXiv:2410.03630</a> in <a href="https://github.com/TuringLang/JuliaBUGS.jl">JuliaBUGS.jl</a>. The paper shows that by exploiting the structure of the compute graph (rather than the graphical model), the time per sweep of a full-scan Gibbs sampler on GLMs can be reduced from <img src="https://latex.codecogs.com/png.latex?O(d%5E2)"> to <img src="https://latex.codecogs.com/png.latex?O(d)"> in the number of parameters <img src="https://latex.codecogs.com/png.latex?d"> – making high-dimensional GLMs feasible where traditional Gibbs is not, and outperforming HMC on effective samples per unit time in many regimes. JuliaBUGS already exposes the graph structure this approach relies on. The implementation must be correct and performant, validated against standard benchmarks with comparisons to both traditional Gibbs and HMC.</p>
</section>
<section id="contributor-proposed-project" class="level2">
<h2 class="anchored" data-anchor-id="contributor-proposed-project">Contributor-proposed Project</h2>
<p><strong>Mentors</strong>: Community</p>
<p>If you have an idea not listed here, propose it. Submit a short proposal with motivation, a concise plan, expected deliverables, and a timeline. Maintainers and mentors will review and help turn it into a plan. Be prepared to discuss scope with mentors early.</p>
<p>To discuss proposals and next steps, contact <a href="https://julialang.slack.com/team/U04UZB5U740">Shravan Goswami</a> on the <a href="https://julialang.org/slack/">Julia Slack</a>.</p>


</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Blog</category>
  <category>GSoC</category>
  <guid>https://turinglang.org/news/posts/2026-02-21-gsoc/</guid>
  <pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 17</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2026-01-23-newsletter-17/</link>
  <description><![CDATA[ 





<p><strong>VarNamedTuple</strong></p>
<p>We have been working on a really complete overhaul of the internal VarInfo data structure (several thousand lines of code changes). Pretty much the entire thing has been rewritten from scratch. There are still a number of kinks to iron out, but CI is passing, so there is nothing really fundamental blocking it, just more test coverage and handling of edge cases, and checking that it doesn’t break anything in Turing.</p>
<p>What you’ll get out of it:</p>
<ul>
<li><p>More internally consistent indexing behaviour: if you have something like <code>x ~ MvNormal(zeros(2), I)</code> and you condition your model on <code>Dict(@varname(x[1]) =&gt; 1.0, @varname(x[2]) =&gt; 2.0)</code> it will now behave correctly (previously the conditioning would have no effect). Colons also benefit a lot from this. Essentially, if I’m not wrong, every item in the table in <a href="https://github.com/TuringLang/DynamicPPL.jl/issues/1148">this issue</a> will more or less become true.</p></li>
<li><p>Generic AbstractArray support: you should be able to use OffsetArrays, DimArrays, etc. and have them ‘just work’ the way you expect them to. For example you should be able to do <code>dimarr[X(1), Y(2)] ~ dist</code> and it should behave just as if you wrote <code>arr[1, 2] ~ dist</code>.</p></li>
<li><p>Much improved performance on many common operations (see <a href="https://github.com/TuringLang/DynamicPPL.jl/pull/1212">this PR</a> for some benchmarks).</p></li>
<li><p>If you develop against DynamicPPL, all our VarInfo subtypes are unified now, there’s no longer a distinction between ‘typed’, ‘untyped’, or ‘simple’ VarInfo.</p></li>
</ul>
<p>If you’re interested in a behind-the-scenes look at why and how we did this, <a href="https://turinglang.org/DynamicPPL.jl/previews/PR1164/vnt/motivation/">there are some docs here</a> (still in progress, but a lot of the basics are covered)! The performance aspects will mostly affect non-HMC/NUTS samplers (since Turing@0.42 / DynamicPPL@0.39, HMC and NUTS almost completely don’t use VarInfo anymore), although the correctness aspects will apply to every Turing model.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2026-01-23-newsletter-17/</guid>
  <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 16</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-12-05-newsletter-16/</link>
  <description><![CDATA[ 





<p>It’s been a while since the last one; things have been brewing in the background… This newsletter will be the last for 2025; normal service will resume in January. We’d like to wish all of you a happy holiday season!</p>
<p><strong>Turing v0.42</strong></p>
<p>A new version of Turing was released yesterday — there is no way we can do justice to the changes in one paragraph so please check out <a href="https://github.com/TuringLang/Turing.jl/releases/tag/v0.42.0">the changelog</a> for full details. Of note are:</p>
<ul>
<li>Threadsafe evaluation is now opt-in, if you have tilde-statements inside threaded blocks you must now write <code>model = setthreadsafe(model, true)</code>. Confused? Don’t worry, there’s a <a href="https://turinglang.org/docs/usage/threadsafe-evaluation/">new docs page</a> that fully explains when and why you need this (and when you don’t)</li>
<li>Changes in DynamicPPL should mean that lots of things are now faster, mostly HMC/NUTS, Prior, and <code>returned</code> / <code>predict</code>. (Personally we also really recommend <a href="https://github.com/penelopeysm/FlexiChains.jl">trying FlexiChains</a> if performance with chains is an issue and your model has lots of vector parameters; there are a growing number of issues on Turing/DynamicPPL where half of the solution is to use FlexiChains)</li>
<li>MCMCChains now stores the log-joint as <code>chn[:logjoint]</code> rather than <code>chn[:lp]</code> — the latter was really a remnant carried over from the times when Turing didn’t track prior and likelihood separately</li>
<li>The VI interface has been changed a fair bit but in return you now have access to a whole host of new VI algorithms including natural gradient VI, batch-and-match, and Wasserstein</li>
<li>Implementing external samplers for Turing should now be much easier, you should only need to depend on AbstractMCMC and not Turing (see the <a href="https://turinglang.org/Turing.jl/stable/api/Inference/#Turing.Inference.ExternalSampler">external sampler docstring</a> and <a href="https://turinglang.org/docs/developers/inference/implementing-samplers/">docs page</a> for examples)</li>
<li>GibbsConditional is back after a long hiatus: the interface is slightly different to before, please see <a href="https://turinglang.org/Turing.jl/stable/api/Inference/#Turing.Inference.GibbsConditional">the docstring</a> for usage examples!</li>
</ul>
<p><strong>Docs</strong></p>
<p>Apart from the <a href="https://turinglang.org/docs/usage/threadsafe-evaluation/">threadsafe evaluation</a> page we also did a refresh of Bijectors.jl’s docs including a new page with some examples of <a href="https://turinglang.org/Bijectors.jl/stable/defining_examples/">how to define your own bijector</a>. And on top of that, on the main TuringLang docs page there are also new shiny links that let you download each docs page as a notebook, or open it as a notebook in Google Colab. Look out for the links in the right sidebar of the page!</p>
<p><strong>DoodleBUGS</strong></p>
<p>Now has a refreshed and much slicker UI: check it out @ https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-12-05-newsletter-16/</guid>
  <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 15</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-11-07-newsletter-15/</link>
  <description><![CDATA[ 





<p><strong>Faster model evaluation</strong></p>
<p><a href="https://github.com/TuringLang/DynamicPPL.jl/pull/1132">This PR</a> makes Turing faster by about 2-10x depending on the size of the model. (Not kidding, see the PR for examples!) Smaller models benefit the most, larger models less so because for those a larger proportion of your time is spent just calculating <code>logpdf</code>.</p>
<p>The main impact is probably in inference. The PR contains an example where NUTS sampling on eight-schools is cut from ~ 8 seconds to ~ 1.5 seconds. The general strategy should lead to speedups for other operations as well such as <code>returned</code> and <code>predict</code>, although those will be less marked as reading from / constructing a chain will be the main bottlenecks.</p>
<p>It’s not released yet, but should hopefully be in the near future!</p>
<p><strong>Mooncake @ 1.12</strong></p>
<p>Just a note to say that there is now a newly released version of Mooncake that works on 1.12, and Turing should be perfectly compatible with it!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-11-07-newsletter-15/</guid>
  <pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 14</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-10-24-newsletter-14/</link>
  <description><![CDATA[ 





<p><strong>Turing v0.41, DynamicPPL 0.38</strong></p>
<p>The big news item this week is that we’ve just released new (twinned) versions of Turing + DynamicPPL! Many of the changes are under the hood: you might see better performance on some functions like <code>predict</code> for example.</p>
<p>The main breaking change comes with the <code>initial_params</code> keyword argument: previously this was supplied as a vector (or vector of vectors for multiple chains). The problem with this is that the meaning of this vector depended on DynamicPPL internals, in a way that users shouldn’t be exposed to. Now, it should be an <code>AbstractInitStrategy</code> (or vector thereof). Essentially, instead of saying “what are the parameters are”, you now specify “how do I get parameters”. This will give you more ways to initialise parameters, and also clearer code.</p>
<p>Docs for the new version are <a href="https://turinglang.org/docs">already live</a>! In the meantime, you can read more details in our <a href="https://github.com/TuringLang/Turing.jl/releases/tag/v0.41.0">release notes</a>.</p>
<p><strong>ProductNamedTupleDistribution</strong></p>
<p>…can (mostly) be used in Turing now! You’ll need to upgrade to v0.41. I say mostly because there is a fairly niche edge case, where <code>product_distribution</code> of <code>Array</code> inside <code>product_distribution</code> of <code>NamedTuple</code> will fail. If you run into this, please feel free to open an issue!</p>
<p><strong>Particle samplers in Julia 1.12</strong></p>
<p>Particle samplers were broken by changes in Julia 1.12’s internals. Over the past few months several fixes have been introduced and you should be able to use these again now! You will need to make sure to upgrade Libtask.jl to 0.9.6, which was <a href="https://github.com/TuringLang/Libtask.jl/releases/tag/v0.9.6">just released today</a>.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-10-24-newsletter-14/</guid>
  <pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 13</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-10-10-newsletter-13/</link>
  <description><![CDATA[ 





<p><strong>Julia 1.12</strong></p>
<p>With the release of 1.12 comes some very nice things and some broken things. Particle samplers (SMC and PG) currently do not work on 1.12, and Enzyme and Mooncake will both not run. Fixes are being worked on, but it may well take until 1.12.1 before everything is in order. If you use any of the above three, you may want to stay with 1.11 for now.</p>
<p><strong>JuliaCon</strong></p>
<p>We were at JuliaCon Paris last week (thanks to the organising team for a wonderful conference)! If you didn’t get the chance to say hi, feel free to take a look at the poster we did <a href="https://github.com/TuringLang/Turing-Workshop/blob/main/2025-JuliaCon/JuliaCon2025_Turing_Poster.pdf">here on GitHub</a>. It very briefly summarises what we’ve been up to in the last few months, what our current priorities are, and what’s likely to come in the future.</p>
<p><strong>MCMCChains plots + stats</strong></p>
<p>In the past few months there have been a number of new plot types added to MCMCChains. You can see examples of <a href="https://turinglang.org/MCMCChains.jl/stable/statsplots/#Energy-Plot">energy plots</a>, <a href="https://turinglang.org/MCMCChains.jl/stable/statsplots/#Violin">violin plots</a>, and <a href="https://turinglang.org/MCMCChains.jl/stable/statsplots/#Posterior-Predictive-Checks-(PPC)">posterior predictive plots</a> in the docs. Also, you can now use <code>MCMCDiagnosticTools.bfmi(::Chains)</code> to calculate the Bayesian fraction of missing information.</p>
<p><strong>Docs</strong></p>
<p>There’s a new page explaining in more detail all the options you can use when sampling: https://turinglang.org/docs/usage/sampling-options/, suggestions for additions are always welcome!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-10-10-newsletter-13/</guid>
  <pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 12</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-09-26-newsletter-12/</link>
  <description><![CDATA[ 





<p>After a bit of an absence (Penny has been busy / away) the newsletter is back…</p>
<p><strong>JuliaCon Local Paris 2025</strong></p>
<p>Markus and Penny will be in Paris next week for JuliaCon! We have <a href="https://pretalx.com/juliacon-local-paris-2025/talk/review/EUKSNDWJEVA8TCD3RRP7A993XMLUAWBX">a poster on Friday morning</a> about all the latest developments in Turing.jl, so please feel free to come and say hi and chat about anything :)</p>
<p><strong>Google Summer of Code projects</strong></p>
<p>We have recently wrapped up our two GSoc projects and the reports are available to read. There is <a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/389">Mateus Maia’s work on RJuliaBUGS</a> – as the name suggests this is an R interface to JuliaBUGS.jl; and also <a href="https://turinglang.org/news/posts/2025-09-01-GSoC-Report-DoodleBUGS/">Shravan Goswami’s DoodleBUGS</a> – a web frontend for creating and editing BUGS models (you can also <a href="https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/">try it out here</a>!).</p>
<p><strong>Core updates</strong></p>
<p>Our refactoring of DynamicPPL internals continues: DynamicPPL v0.37 / Turing v0.40 was quite a major release (for us!) and in particular overhauls the way that log-probabilities are tracked when evaluating a model. For the regular Turing.jl user you will hopefully find quite little difference, but one bonus is that in MCMC sampling log-probabilities are now correctly tracked in the returned chain: you can access <code>chn[:lp]</code> for the log-joint, but also <code>chn[:logprior]</code> and <code>chn[:loglikelihood]</code>. All of these probabilities are also consistently returned in the “unlinked space”, i.e., they don’t include any Jacobian terms obtained from transforming constrained distributions (these terms are an implementation detail and shouldn’t be ‘leaked’ to the user). Previously only <code>chn[:lp]</code> was provided and the meaning of that varied from sampler to sampler.</p>
<p><strong>Mooncake forward-mode</strong></p>
<p>Mooncake.jl now has a new forwards-mode AD system which you can use with <code>AutoMooncakeForward()</code>. It should work with almost all Turing models and our ADTests website has benchmarks (reverse mode is still faster for most things!)</p>
<p><strong>Docs</strong></p>
<p>There are some new additions to the Turing docs including <a href="https://turinglang.org/docs/faq/">a list of FAQs</a>, as well as <a href="https://turinglang.org/docs/usage/submodels/">a more thorough page on submodels</a> and how to use one of Turing’s most unique features. If you have particular requests for documentation please do let us know as we’ll be attempting to spend some consistent time working on the docs.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-09-26-newsletter-12/</guid>
  <pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>GSoC Report for DoodleBUGS: a Browser-Based Graphical Interface for Drawing Probabilistic Graphical Models</title>
  <dc:creator>Shravan Goswami</dc:creator>
  <link>https://turinglang.org/news/posts/2025-09-01-GSoC-Report-DoodleBUGS/</link>
  <description><![CDATA[ 





<section id="tldr" class="level2">
<h2 class="anchored" data-anchor-id="tldr">TL;DR</h2>
<ul>
<li>BUGS (Bayesian Inference Using Gibbs Sampling) is a probabilistic programming language for Bayesian models, and JuliaBUGS is its modern implementation in Julia. DoodleBUGS is a browser-based graphical interface for JuliaBUGS, allowing users to draw probabilistic graphical models and generate BUGS code.</li>
<li>Implemented: visual editor (nodes, edges, nested plates), legacy BUGS code generation that compiles with <a href="https://github.com/TuringLang/JuliaBUGS.jl">JuliaBUGS</a> <span class="citation" data-cites="JuliaBUGS bugs-book">[1], [2]</span>, local execution via a Julia backend, unified standalone script generation (frontend), timeouts, multiple layouts, and extensive cleanup/typing.</li>
<li>Changed from proposal: frontend implemented in Vue 3 (instead of React); backend simplified (frontend is the single source of truth for standalone scripts).</li>
<li>Status: Working application. Try it here (static UI): <a href="https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/">https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/</a>. For local inference, run the backend server.</li>
</ul>
</section>
<section id="doodlebugs-ui" class="level2">
<h2 class="anchored" data-anchor-id="doodlebugs-ui">DoodleBUGS UI</h2>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://turinglang.org/news/posts/2025-09-01-GSoC-Report-DoodleBUGS/DoodleBUGS.png" class="img-fluid figure-img"></p>
<figcaption>DoodleBUGS UI</figcaption>
</figure>
</div>
</section>
<section id="doodlebugs-project-structure" class="level2">
<h2 class="anchored" data-anchor-id="doodlebugs-project-structure">DoodleBUGS Project Structure</h2>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>Directory Structure</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" data-filename="Directory Structure" style="background: #f1f3f5;"><pre class="sourceCode bash code-overflow-scroll code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">DoodleBUGS/</span>                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Vite + Vue 3 app (UI editor)</span></span>
<span id="cb1-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">├──</span> README.md              <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># project documentation</span></span>
<span id="cb1-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">├──</span> public/                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># static assets served by Vite</span></span>
<span id="cb1-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   └── examples/          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># example projects</span></span>
<span id="cb1-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">├──</span> experiments/           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># prototypes and exploratory work</span></span>
<span id="cb1-6"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">├──</span> runtime/               <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Julia HTTP backend (API endpoints &amp; dependencies)</span></span>
<span id="cb1-7"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">├──</span> src/                   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># application source</span></span>
<span id="cb1-8"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   ├── assets/            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># styles and static assets</span></span>
<span id="cb1-9"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   ├── components/        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Vue components composing the UI</span></span>
<span id="cb1-10"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   ├── canvas/        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># graph canvas and toolbars</span></span>
<span id="cb1-11"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   ├── common/        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># shared UI primitives</span></span>
<span id="cb1-12"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   ├── layouts/       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># app layout and modals</span></span>
<span id="cb1-13"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   │   └── MainLayout.vue   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># main application layout</span></span>
<span id="cb1-14"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   ├── left-sidebar/  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># palette, project manager, execution settings</span></span>
<span id="cb1-15"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   ├── panels/        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># code preview and data input panels</span></span>
<span id="cb1-16"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   ├── right-sidebar/ <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># execution, JSON editor, node properties</span></span>
<span id="cb1-17"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   │   └── ui/            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># base UI elements (buttons, inputs, selects)</span></span>
<span id="cb1-18"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   ├── composables/       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># reusable logic (codegen, drag &amp; drop, graph, validator, grid)</span></span>
<span id="cb1-19"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   ├── config/            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># configuration and node definitions</span></span>
<span id="cb1-20"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   ├── stores/            <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Pinia state stores (graph, data, execution, project, UI)</span></span>
<span id="cb1-21"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">│</span>   └── types/             <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># TypeScript types and ambient declarations</span></span>
<span id="cb1-22"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">├──</span> tmp/                   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># local temporary outputs (ignored in builds)</span></span>
<span id="cb1-23"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">└──</span> ztest/                 <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># scratch/test artifacts</span></span></code></pre></div></div>
</div>
</section>
<section id="motivation" class="level2">
<h2 class="anchored" data-anchor-id="motivation">Motivation</h2>
<p><a href="https://github.com/TuringLang/JuliaBUGS.jl">JuliaBUGS</a> is a modern Julia implementation of the BUGS language <span class="citation" data-cites="bugs-rjournal bugs-book bugs-project">[2], [3], [4]</span>. DoodleBUGS revives the original visual modelling concept with a modern browser-based stack so users can:</p>
<ul>
<li>Construct probabilistic graphical models visually (nodes, edges, plates).</li>
<li>Export readable legacy BUGS code that compiles with JuliaBUGS <span class="citation" data-cites="JuliaBUGS bugs-rjournal bugs-book">[1], [2], [3]</span>.</li>
<li>Run inference and inspect results from the UI. Common BUGS applications include parallel MCMC <span class="citation" data-cites="multibugs">[5]</span>, survival analysis <span class="citation" data-cites="bugs-survival">[6]</span>, and Gibbs-style samplers <span class="citation" data-cites="albert-chib-1993 informs-gibbs">[7], [8]</span>.</li>
</ul>
</section>
<section id="what-was-built" class="level2">
<h2 class="anchored" data-anchor-id="what-was-built">What Was Built</h2>
<ul>
<li>Visual editor
<ul>
<li>Node types: stochastic, observed, deterministic</li>
<li>Plates with arbitrary nesting; robust drag-in/out and creation inside plates</li>
<li>Graph layouts: Dagre (default), fCoSE (Force-Directed), Cola (Physics Simulation), KLay (Layered); stable interactions</li>
</ul></li>
<li>Legacy BUGS code generation <span class="citation" data-cites="bugs-rjournal bugs-book">[2], [3]</span>
<ul>
<li>Topological ordering and plate-aware traversal</li>
<li>Parameter formatting and safe index expansion</li>
<li>Implemented in <code>DoodleBUGS/src/composables/useBugsCodeGenerator.ts</code></li>
</ul></li>
<li>Execution flow
<ul>
<li>Frontend POSTs to <code>/api/run</code> with body: <code>model_code</code> (BUGS), <code>data</code> and <code>inits</code> (JSON), <code>data_string</code> and <code>inits_string</code> (Julia NamedTuple literals), and <code>settings</code> <code>{ n_samples, n_adapts, n_chains, seed, timeout_s }</code>. If <code>/api/run</code> returns 404, it falls back to <code>/api/run_model</code>.</li>
<li>Backend creates a temp dir, writes <code>model.bugs</code> and <code>payload.json</code>, generates an ephemeral <code>run_script.jl</code>, compiles with <code>JuliaBUGS.@bugs</code>, wraps with <code>ADgradient(:ReverseDiff)</code>, and samples via <code>AdvancedHMC.NUTS</code> through <code>AbstractMCMC</code> (Threads or Serial). It writes summaries (incl.&nbsp;ESS, R-hat) and quantiles to JSON and returns <code>{ success, summary, quantiles, logs, files[] }</code>, where <code>files</code> includes <code>model.bugs</code>, <code>payload.json</code>, <code>run_script.jl</code>, and <code>results.json</code>.</li>
<li>Frontend also generates a <code>standalone.jl</code> script locally (mirrors backend execution) and shows it alongside the backend files; the backend does not attach a standalone script.</li>
</ul></li>
<li>Timeouts/resilience
<ul>
<li>Configurable timeout (frontend); enforced in backend worker</li>
<li>Safe temp directory cleanup on Windows with retries</li>
</ul></li>
<li>Cleanup/typing
<ul>
<li>Strong, project-wide TypeScript typing across stores, components, and composables</li>
<li>Removal of unused backend code; consistent naming and logs</li>
</ul></li>
</ul>
</section>
<section id="architecture-overview" class="level2">
<h2 class="anchored" data-anchor-id="architecture-overview">Architecture Overview</h2>
<ul>
<li>Frontend: <a href="https://vuejs.org/">Vue 3</a>, <a href="https://pinia.vuejs.org/">Pinia</a>, <a href="https://js.cytoscape.org/">Cytoscape.js</a> <span class="citation" data-cites="cytoscapejs">[9]</span>, <a href="https://codemirror.net/">CodeMirror</a>
<ul>
<li>Code generation: <code>DoodleBUGS/src/composables/useBugsCodeGenerator.ts</code></li>
<li>Execution panel: <code>DoodleBUGS/src/components/right-sidebar/ExecutionPanel.vue</code></li>
</ul></li>
<li>Backend (Julia) HTTP server
<ul>
<li>Server: <code>DoodleBUGS/runtime/server.jl</code></li>
<li>Project deps: <code>DoodleBUGS/runtime/Project.toml</code> (HTTP, JSON3, JuliaBUGS, AbstractMCMC, AdvancedHMC, ReverseDiff, MCMCChains, DataFrames, StatsBase, Statistics)</li>
<li>Endpoints: GET <code>/api/health</code>; POST <code>/api/run</code> and <code>/api/run_model</code></li>
<li>Execution: creates temp dir, writes <code>model.bugs</code> and <code>payload.json</code>, generates <code>run_script.jl</code>, enforces optional timeout</li>
</ul></li>
</ul>
</section>
<section id="design-principles-and-architecture" class="level2">
<h2 class="anchored" data-anchor-id="design-principles-and-architecture">Design Principles and Architecture</h2>
<p><strong>Design principles</strong></p>
<ul>
<li>Visual-first modeling with deterministic export to legacy BUGS <span class="citation" data-cites="bugs-rjournal bugs-book">[2], [3]</span>.</li>
<li>Separation of concerns: editing (graph), generation (BUGS), execution (backend), and results (summary/quantiles) are modular.</li>
<li>Deterministic ordering: topological sort + plate-aware traversal ensures readable, stable code output.</li>
<li>Robustness: cancellable frontend fetch, backend-enforced timeout, and resilient temp cleanup on Windows (<code>safe_rmdir()</code>).</li>
</ul>
<p><strong>Frontend architecture (Vue 3 + Cytoscape.js)</strong></p>
<ul>
<li>Core graph state is managed in Vue; <a href="https://js.cytoscape.org/">Cytoscape.js</a> handles layout, hit-testing, and interaction semantics (including compound nodes for plates) <span class="citation" data-cites="cytoscapejs">[9]</span>.</li>
<li>Code generation lives in <code>DoodleBUGS/src/composables/useBugsCodeGenerator.ts</code> and maps <code>GraphNode</code>/<code>GraphEdge</code> to BUGS:
<ul>
<li>Kahn topological sort for definition order</li>
<li>Plate-aware recursion for <code>for (...) { ... }</code> blocks</li>
<li>Parameter canonicalization (indices, numeric/expr passthrough)</li>
</ul></li>
<li>Standalone Julia script generation uses <code>generateStandaloneScript()</code> in the same composable, mirroring backend execution.</li>
</ul>
<p><strong>Backend architecture (Julia)</strong></p>
<ul>
<li><code>run_model_handler()</code> in <code>DoodleBUGS/runtime/server.jl</code> materializes <code>model.bugs</code>, <code>payload.json</code>, and a transient <code>run_script.jl</code> that:
<ul>
<li>Builds <code>NamedTuple</code>s from JSON or string-literal data/inits</li>
<li>Compiles via <code>JuliaBUGS.@bugs</code>, wraps with <code>ADgradient(:ReverseDiff)</code> <span class="citation" data-cites="ReverseDiff">[10]</span></li>
<li>Samples with <code>AdvancedHMC.NUTS</code> through <code>AbstractMCMC</code> (Threads or Serial) <span class="citation" data-cites="AdvancedHMC AbstractMCMC HoffmanGelman2014">[11], [12], [13]</span></li>
<li>Emits summaries (incl.&nbsp;ESS and R-hat) via <code>MCMCChains</code>/<code>DataFrames</code> and quantiles to JSON <span class="citation" data-cites="MCMCChains DataFrames">[14], [15]</span></li>
<li>Timeout: worker process is killed if exceeding <code>timeout_s</code>.</li>
<li>Cleanup: <code>safe_rmdir()</code> retries with GC to avoid EBUSY on Windows.</li>
</ul></li>
</ul>
</section>
<section id="why-vue-not-react" class="level2">
<h2 class="anchored" data-anchor-id="why-vue-not-react">Why Vue (not React)?</h2>
<p>The proposal planned React; we chose Vue 3 after evaluating the graph layer and developer velocity for this app.</p>
<ul>
<li>Tried Konva (canvas) for custom graph editing: powerful drawing primitives, but required bespoke graph semantics (hit testing, edge routing, compound nodes) that <a href="https://js.cytoscape.org/">Cytoscape.js</a> provides out of the box.</li>
<li>Tried D3 force/layouts: flexible, but compound nodes (plates), nesting, and drag constraints became a significant amount of custom code to maintain.</li>
<li><a href="https://js.cytoscape.org/">Cytoscape.js</a> offered:
<ul>
<li>Native graph model with compound nodes (great for plates)</li>
<li>Integrated layouts (Dagre, fCoSE, Cola, KLay) and rich interaction APIs <span class="citation" data-cites="webcola elk">[16], [17]</span></li>
<li>Mature ecosystem and performance characteristics for medium-sized graphs</li>
</ul></li>
<li><a href="https://vuejs.org/">Vue 3</a> (vs React) for this project:
<ul>
<li>Composition API made integrating an imperative graph library (Cytoscape) straightforward via composables and lifecycle hooks</li>
<li>SFC ergonomics and Pinia stores enabled quick iteration with strong TypeScript support</li>
<li>Template reactivity + refs reduced reconciliation overhead when bridging to Cytoscape’s imperative API</li>
<li>Minimal glue code for state management (Pinia) vs setting up reducers/selectors; enabled rapid iteration</li>
<li>Vite + Vue tooling yielded fast HMR for UI-heavy iterations</li>
</ul></li>
<li>Design inspirations: draw.io for interaction affordances; Stan Playground for model/run UX <span class="citation" data-cites="drawio stan-playground">[18], [19]</span>.</li>
</ul>
</section>
<section id="comparison-to-legacy-doodlebugs" class="level2">
<h2 class="anchored" data-anchor-id="comparison-to-legacy-doodlebugs">Comparison to Legacy DoodleBUGS</h2>
<p>The legacy tool was a windows desktop application driving WinBUGS <span class="citation" data-cites="winbugs">[20]</span>; the new DoodleBUGS is a browser-based editor targeting JuliaBUGS <span class="citation" data-cites="JuliaBUGS">[1]</span>.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://turinglang.org/news/posts/2025-09-01-GSoC-Report-DoodleBUGS/Legacy-DoodleBUGS.png" class="img-fluid figure-img"></p>
<figcaption>Legacy DoodleBUGS</figcaption>
</figure>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://turinglang.org/news/posts/2025-09-01-GSoC-Report-DoodleBUGS/New-DoodleBUGS.png" class="img-fluid figure-img"></p>
<figcaption>New DoodleBUGS</figcaption>
</figure>
</div>
<p>Key differences:</p>
<ul>
<li>Platform and backend
<ul>
<li>Legacy: Desktop UI, WinBUGS execution pipeline</li>
<li>New: Web UI, Julia backend via <code>JuliaBUGS.@bugs</code>, sampling with <code>AdvancedHMC.NUTS</code> through <code>AbstractMCMC</code></li>
</ul></li>
<li>Graph engine and plates
<ul>
<li>Legacy: Bespoke graph handling with limited nesting semantics</li>
<li>New: <a href="https://js.cytoscape.org/">Cytoscape.js</a> with compound nodes for robust nested plates; custom drag-and-drop for drag-in/out and creating inside plates</li>
</ul></li>
<li>Layouts and interactions
<ul>
<li>Legacy: Limited auto-layout support</li>
<li>New: Multiple layout engines (Dagre, fCoSE, Cola, KLay) and stable interactions; positions updated after <code>layoutstop</code> <span class="citation" data-cites="webcola elk">[16], [17]</span></li>
</ul></li>
<li>Code generation
<ul>
<li>Legacy: Export to BUGS without strong ordering guarantees</li>
<li>New: Deterministic topological + plate-aware traversal; parameter canonicalization and safe index expansion</li>
</ul></li>
<li>Execution and tooling
<ul>
<li>Legacy: WinBUGS-managed runs</li>
<li>New: Lightweight Julia HTTP backend, configurable timeouts, resilient temp cleanup, JSON summaries via <code>MCMCChains</code></li>
</ul></li>
<li>DevX and maintainability
<ul>
<li>New: Vue 3 + TypeScript + Pinia; unified standalone script generation on the frontend; leaner backend responses</li>
</ul></li>
</ul>
</section>
<section id="progress-vs-proposal" class="level2">
<h2 class="anchored" data-anchor-id="progress-vs-proposal">Progress vs Proposal</h2>
<ul>
<li>Implemented
<ul>
<li>Visual editor with nested plates and robust drag-and-drop</li>
<li>BUGS code generator (topological + plate-aware)</li>
<li>Local execution + summaries/quantiles</li>
<li>Unified standalone script generation (frontend)</li>
<li>Timeouts/resilience</li>
<li>Multiple layouts and interactions</li>
<li>Extensive cleanup/typing</li>
<li>Execution timeout (end-to-end)</li>
<li>Layout options (Dagre (default, layered), fCoSE (force-directed), Cola (physics simulation), KLay (layered)) and interactions</li>
<li>Cleanup and stronger typing</li>
</ul></li>
<li>Changed
<ul>
<li>Vue 3 instead of React</li>
<li>Backend responses smaller; no standalone script attachment</li>
</ul></li>
<li>Deferred/Partial
<ul>
<li>Visualizations: integrate with MCMCChains.jl for plots (trace, density, PPC, diagnostics). ESS and R-hat already included in summary statistics.</li>
<li>WebKit/Safari support</li>
<li>UX polish for large graphs</li>
</ul></li>
</ul>
</section>
<section id="how-to-run-locally" class="level2">
<h2 class="anchored" data-anchor-id="how-to-run-locally">How to Run Locally</h2>
<p>Frontend (Vite):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># from repo root</span></span>
<span id="cb2-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> DoodleBUGS</span>
<span id="cb2-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npm</span> install</span>
<span id="cb2-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">npm</span> run dev</span></code></pre></div></div>
<p>Backend (Julia):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode bash code-overflow-scroll code-with-copy"><code class="sourceCode bash"><span id="cb3-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># from repo root</span></span>
<span id="cb3-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">julia</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--project</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>DoodleBUGS/runtime DoodleBUGS/runtime/server.jl</span>
<span id="cb3-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># server listens on http://localhost:8081</span></span></code></pre></div></div>
<p>Notes:</p>
<ul>
<li>CORS is enabled in the backend so the dev UI can call <code>http://localhost:8081</code>.</li>
<li>Try it here (static UI): <a href="https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/">https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/</a></li>
</ul>
</section>
<section id="api-summary-for-backend-server" class="level2">
<h2 class="anchored" data-anchor-id="api-summary-for-backend-server">API Summary for Backend Server</h2>
<ul>
<li>GET <code>/api/health</code> → <code>{ "status": "ok" }</code></li>
<li>POST <code>/api/run</code> (alias: <code>/api/run_model</code>)
<ul>
<li>Body: <code>model_code</code>, <code>data</code> (JSON), <code>inits</code> (JSON), <code>data_string</code> (Julia literal), <code>inits_string</code> (Julia literal), <code>settings</code> <code>{ n_samples, n_adapts, n_chains, seed, timeout_s }</code></li>
<li>Response: <code>{ success, summary, quantiles, logs, files[] }</code> where <code>files[]</code> contains <code>model.bugs</code>, <code>payload.json</code>, <code>run_script.jl</code>, <code>results.json</code></li>
<li>Note: Frontend falls back to <code>/api/run_model</code> if <code>/api/run</code> is unavailable (404)</li>
</ul></li>
</ul>
<p>See <code>DoodleBUGS/runtime/server.jl</code>.</p>
</section>
<section id="current-limitations" class="level2">
<h2 class="anchored" data-anchor-id="current-limitations">Current Limitations</h2>
<ul>
<li>WebKit/Safari/iOS: unsupported at this time (see <code>DoodleBUGS/README.md</code>).</li>
<li>Limited visualization beyond summary/quantiles.</li>
<li>Overlapped plates (nodes with multiple parent plates) are currently not supported; see <a href="https://github.com/TuringLang/JuliaBUGS.jl/issues/362">#362</a>.</li>
</ul>
</section>
<section id="future-work" class="level2">
<h2 class="anchored" data-anchor-id="future-work">Future Work</h2>
<ul>
<li>Backend: Add Pluto.jl as a backend for supporting compound documents and QuartoNotebookRunner.jl for running notebooks.</li>
<li>Diagnostics/visualization: integrate with MCMCChains.jl for plots (trace, density, PPC, diagnostics). ESS and R-hat already available in summary stats.</li>
<li>UX: richer node templates, validation, distribution hints</li>
<li>Sharing: shareable links/cloud sync (projects already persisted locally)</li>
<li>Browser compatibility: WebKit/Safari and iOS/iPadOS</li>
<li>Performance: virtualization for large graphs</li>
</ul>
</section>
<section id="acknowledgements" class="level2">
<h2 class="anchored" data-anchor-id="acknowledgements">Acknowledgements</h2>
<p>Much appreciation goes to my mentors Xianda Sun and Hong Ge. The work is impossible without your help and support.</p>
<ul>
<li>Mentors: Xianda Sun (<a href="https://github.com/sunxd3">@sunxd3</a>) and Hong Ge (<a href="https://github.com/yebai">@yebai</a>)</li>
<li>TuringLang/JuliaBUGS community and contributors</li>
</ul>
</section>
<section id="appendix-project-links" class="level2">
<h2 class="anchored" data-anchor-id="appendix-project-links">Appendix: Project Links</h2>
<ul>
<li>Repo: <a href="https://github.com/TuringLang/JuliaBUGS.jl">https://github.com/TuringLang/JuliaBUGS.jl</a></li>
<li>Try it here: <a href="https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/">https://turinglang.org/JuliaBUGS.jl/DoodleBUGS/</a></li>
</ul>
</section>
<section id="prs-during-gsoc" class="level2">
<h2 class="anchored" data-anchor-id="prs-during-gsoc">PRs during GSoC</h2>
<ul>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/321">#321 - Add ISSUE template for DoodleBUGS</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/339">#339 - DoodleBUGS Project: Phase 1</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/340">#340 - DoodleBUGS: update all workflows to run on relevent project only</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/341">#341 - Exclude navigation bar from DoodleBUGS project</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/347">#347 - DoodleBUGS: Basic Code Generation, Advanced Exports, and State Persistence</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/357">#357 - DoodleBUGS: Allow Nested Plates, add new layouts and fix lot of linting issues</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/368">#368 - New Folder Structure</a></li>
<li><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/388">#388 - DoodleBUGS Project: Phase 2 (Backend)</a></li>
</ul>



</section>

<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a><div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body" data-entry-spacing="0">
<div id="ref-JuliaBUGS" class="csl-entry">
<div class="csl-left-margin">[1] </div><div class="csl-right-inline"><span>“JuliaBUGS.jl.”</span> Available: <a href="https://github.com/TuringLang/JuliaBUGS.jl">https://github.com/TuringLang/JuliaBUGS.jl</a></div>
</div>
<div id="ref-bugs-book" class="csl-entry">
<div class="csl-left-margin">[2] </div><div class="csl-right-inline"><span>“The BUGS book: A practical introduction to bayesian analysis.”</span> Wiley. Available: <a href="https://onlinelibrary.wiley.com/doi/10.1111/anzs.12058">https://onlinelibrary.wiley.com/doi/10.1111/anzs.12058</a></div>
</div>
<div id="ref-bugs-rjournal" class="csl-entry">
<div class="csl-left-margin">[3] </div><div class="csl-right-inline"><span>“The BUGS language.”</span> Available: <a href="https://journal.r-project.org/articles/RN-2006-005/RN-2006-005.pdf">https://journal.r-project.org/articles/RN-2006-005/RN-2006-005.pdf</a></div>
</div>
<div id="ref-bugs-project" class="csl-entry">
<div class="csl-left-margin">[4] </div><div class="csl-right-inline"><span>“The BUGS project.”</span> Available: <a href="https://www.mrc-bsu.cam.ac.uk/software/bugs/">https://www.mrc-bsu.cam.ac.uk/software/bugs/</a></div>
</div>
<div id="ref-multibugs" class="csl-entry">
<div class="csl-left-margin">[5] </div><div class="csl-right-inline"><span>“MultiBUGS: Parallel BUGS modeling.”</span> Available: <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC7116196/">https://pmc.ncbi.nlm.nih.gov/articles/PMC7116196/</a></div>
</div>
<div id="ref-bugs-survival" class="csl-entry">
<div class="csl-left-margin">[6] </div><div class="csl-right-inline"><span>“Bayesian survival analysis with BUGS.”</span> Available: <a href="https://onlinelibrary.wiley.com/doi/10.1002/sim.8933">https://onlinelibrary.wiley.com/doi/10.1002/sim.8933</a></div>
</div>
<div id="ref-albert-chib-1993" class="csl-entry">
<div class="csl-left-margin">[7] </div><div class="csl-right-inline"><span>“Inference via gibbs (albert &amp; chib).”</span> Available: <a href="https://apps.olin.wustl.edu/faculty/chib/papers/albertchibjb93.pdf">https://apps.olin.wustl.edu/faculty/chib/papers/albertchibjb93.pdf</a></div>
</div>
<div id="ref-informs-gibbs" class="csl-entry">
<div class="csl-left-margin">[8] </div><div class="csl-right-inline"><span>“Bayesian inference using gibbs sampling.”</span> Available: <a href="https://pubsonline.informs.org/doi/10.1287/ited.2013.0120">https://pubsonline.informs.org/doi/10.1287/ited.2013.0120</a></div>
</div>
<div id="ref-cytoscapejs" class="csl-entry">
<div class="csl-left-margin">[9] </div><div class="csl-right-inline"><span>“Cytoscape.js.”</span> Available: <a href="https://js.cytoscape.org/">https://js.cytoscape.org/</a></div>
</div>
<div id="ref-ReverseDiff" class="csl-entry">
<div class="csl-left-margin">[10] </div><div class="csl-right-inline"><span>“ReverseDiff.jl.”</span> Available: <a href="https://github.com/JuliaDiff/ReverseDiff.jl">https://github.com/JuliaDiff/ReverseDiff.jl</a></div>
</div>
<div id="ref-AdvancedHMC" class="csl-entry">
<div class="csl-left-margin">[11] </div><div class="csl-right-inline"><span>“AdvancedHMC.jl.”</span> Available: <a href="https://github.com/TuringLang/AdvancedHMC.jl">https://github.com/TuringLang/AdvancedHMC.jl</a></div>
</div>
<div id="ref-AbstractMCMC" class="csl-entry">
<div class="csl-left-margin">[12] </div><div class="csl-right-inline"><span>“AbstractMCMC.jl.”</span> Available: <a href="https://github.com/TuringLang/AbstractMCMC.jl">https://github.com/TuringLang/AbstractMCMC.jl</a></div>
</div>
<div id="ref-HoffmanGelman2014" class="csl-entry">
<div class="csl-left-margin">[13] </div><div class="csl-right-inline">M. D. Hoffman and A. Gelman, <span>“The no-u-turn sampler: Adaptively setting path lengths in hamiltonian monte carlo,”</span> <em>arXiv preprint arXiv:1111.4246</em>, 2014, Available: <a href="https://arxiv.org/abs/1111.4246">https://arxiv.org/abs/1111.4246</a></div>
</div>
<div id="ref-MCMCChains" class="csl-entry">
<div class="csl-left-margin">[14] </div><div class="csl-right-inline"><span>“MCMCChains.jl.”</span> Available: <a href="https://github.com/TuringLang/MCMCChains.jl">https://github.com/TuringLang/MCMCChains.jl</a></div>
</div>
<div id="ref-DataFrames" class="csl-entry">
<div class="csl-left-margin">[15] </div><div class="csl-right-inline"><span>“DataFrames.jl.”</span> Available: <a href="https://dataframes.juliadata.org/">https://dataframes.juliadata.org/</a></div>
</div>
<div id="ref-webcola" class="csl-entry">
<div class="csl-left-margin">[16] </div><div class="csl-right-inline"><span>“WebCola.”</span> Available: <a href="https://ialab.it.monash.edu/webcola/">https://ialab.it.monash.edu/webcola/</a></div>
</div>
<div id="ref-elk" class="csl-entry">
<div class="csl-left-margin">[17] </div><div class="csl-right-inline"><span>“Eclipse layout kernel (ELK / KLay).”</span> Available: <a href="https://www.eclipse.org/elk/">https://www.eclipse.org/elk/</a></div>
</div>
<div id="ref-drawio" class="csl-entry">
<div class="csl-left-margin">[18] </div><div class="csl-right-inline"><span>“Draw.io (diagrams.net).”</span> Available: <a href="https://www.diagrams.net/">https://www.diagrams.net/</a></div>
</div>
<div id="ref-stan-playground" class="csl-entry">
<div class="csl-left-margin">[19] </div><div class="csl-right-inline"><span>“Stan playground.”</span> Available: <a href="https://stan-playground.flatironinstitute.org/">https://stan-playground.flatironinstitute.org/</a></div>
</div>
<div id="ref-winbugs" class="csl-entry">
<div class="csl-left-margin">[20] </div><div class="csl-right-inline"><span>“WinBUGS.”</span> Available: <a href="http://www.openbugs.net/w/FrontPage">http://www.openbugs.net/w/FrontPage</a></div>
</div>
</div></section></div> ]]></description>
  <category>GSoC</category>
  <category>Blog</category>
  <guid>https://turinglang.org/news/posts/2025-09-01-GSoC-Report-DoodleBUGS/</guid>
  <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 11</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-07-25-newsletter-11/</link>
  <description><![CDATA[ 





<p><strong>Libtask and Turing.jl</strong></p>
<p>The new versions of Libtask and AdvancedPS have now been integrated into Turing.jl proper. You shouldn’t see any changes, except that particle MCMC methods will now run a lot faster!</p>
<p>(Do note that these won’t work on Julia 1.12 just yet as it is somewhat tightly coupled to Julia internals; we’re working on a fix but if you really want to use Turing on 1.12 right now you will have to stick to Turing ≤ 0.39.6.)</p>
<p><strong>Progress bars</strong></p>
<p>AbstractMCMC 5.7 is released with the new progress bars! By default you get a single progress bar (but with more frequent updates). You need to opt-in to per-chain progress bars with <code>sample(...; progress=:perchain)</code></p>
<p><strong>ADTests categories</strong></p>
<p><a href="https://turinglang.org/ADTests/">The list of models has been split up</a> into different sections to make it a bit easier to read. I’m keen to add more examples of integrations with other packages — if you have a Turing model that uses functionality from a different package inside it, please do get in touch with an example! (I’ll be adding things like DifferentialEquations, HiddenMarkovModels, and AbstractGPs soon, since those are already in our docs)</p>
<p><strong>Community meetings</strong></p>
<p>The Turing.jl developer team usually meet once every week; we’re thinking of opening some of these meetings to be public (perhaps once a month) and would like to gauge whether there’s any interest in this. Our current thinking is that these meetings would be something along the lines of:</p>
<ul>
<li>3 guests with 1 topic each, 10 minutes each: these would be user-submitted and could really be anything you wanted to talk about, e.g.&nbsp;how to write a model, what samplers to use, … And basic stuff is totally fine as that means more people get to learn how to do Bayesian modelling :)</li>
<li>10 minutes from us on “where Turing is going”</li>
<li>20 minutes free Q&amp;A</li>
</ul>
<p>If you would be interested in attending such a meeting or bringing along a topic, do <a href="https://julialang.slack.com/archives/CCYDC34A0/p1753712389947349">let us know on Slack</a>!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-07-25-newsletter-11/</guid>
  <pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 10</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-07-11-newsletter-10/</link>
  <description><![CDATA[ 





<p><strong>LKJCholesky</strong></p>
<p>Sampling <code>LKJCholesky</code> with HMC/NUTS has, until now, failed because of numerical instabilities (you’d usually get a <code>DomainError</code> somewhere). Bijectors.jl has gotten a couple of fixes (<a href="https://github.com/TuringLang/Bijectors.jl/pull/356">here</a> and <a href="https://github.com/TuringLang/Bijectors.jl/pull/357">here</a>, just released v0.15.8 today that contains both of these) that should fix this, hopefully once and for all! (There are still some issues with <code>LKJ</code> itself, see <a href="https://github.com/TuringLang/Bijectors.jl/pull/395">this PR</a>. But now with <code>LKJCholesky</code> working there is less need for <code>LKJ</code> :))</p>
<p><strong>Multiple-chain progress bars</strong></p>
<p>Not released yet, but you might like to see <a href="https://github.com/TuringLang/AbstractMCMC.jl/pull/168">this PR (and the videos therein!)</a> which, if merged, will provide more detailed progress bars when sampling with <code>MCMCThreads()</code> or <code>MCMCDistributed()</code>. Currently, the default is that for 10 chains or fewer you’ll get one progress bar per chain; above that there’ll just be one overall progress bar, but it’ll update more than once per chain. That’s customisable, and if you think the default should be different feel free to drop a line!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-07-11-newsletter-10/</guid>
  <pubDate>Fri, 11 Jul 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 9</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-06-20-newsletter-9/</link>
  <description><![CDATA[ 





<p><strong>Google Summer of Code</strong></p>
<p>We will have two GSoC students this year working with us: their projects are both focused on JuliaBUGS.jl, one on developing a graphical interface in a web browser, and another on an R interface. We (re?-)welcome Mateus and Shravan — if you see them around do say hi 🙂</p>
<p><strong>TuringGLM.jl</strong></p>
<p>We’ve been thinking about putting in some work on <a href="https://github.com/TuringLang/TuringGLM.jl">TuringGLM.jl</a>, which allows one to create Turing models using formula syntax (similar to that in brms, lme4 or bambi). There are (as always) plenty of things for us to work through, but if you’ve used this and would like to let us know about what you’d like to see in it, feel free to message or open an issue on the repository!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-06-20-newsletter-9/</guid>
  <pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 8</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-06-06-newsletter-8/</link>
  <description><![CDATA[ 





<p>The major update this week is the release of Turing.jl v0.39. The biggest change is the update to AdvancedVI 0.4, and corresponding changes in Turing’s VI interface. We’re still working on bringing all the docs up to date, but here’s what you can expect from the new version:</p>
<ul>
<li>location-scale families with dense scale matrices,</li>
<li>parameter-free stochastic optimization algorithms like <code>DoG</code> and <code>DoWG</code>,</li>
<li>proximal operators for stable optimization,</li>
<li>the sticking-the-landing control variate for faster convergence, and</li>
<li>the score gradient estimator for non-differentiable targets.</li>
</ul>
<p>There are some other small changes to do with imports and exports. The brief summary is: <code>@addlogprob!</code> is now formally exported. There are a bunch of other, unexported, things where you may need to change from <code>Turing.foo</code> to <code>DynamicPPL.foo</code> – although this probably only applies if you were using DynamicPPL internals. If you have any issues with these please feel free to get in touch.</p>
<p>Apart from this, we have also released AdvancedHMC.jl 0.8! Breaking changes include: - if you are relying the internal <code>transition</code> to make an MCMC transition from phase point <code>z</code> using trajectory <code>τ</code> (or HMCKernel <code>κ</code>) with Hamiltonian <code>h</code>, please note the signature has changed. The usage should now always be <code>transition(h, τ, z)</code> or <code>transition(h, κ, z)</code>. - HMC sampling requires appropriate step size for the Leapfrog integration, as the chosen step size directly affects the numerical stability of the integration process. While AdvancedHMC.jl provides <code>find_good_stepsize</code> to find a suitable step size during HMC sampling, it didn’t support manual step size specification, which caused unnecessary searching. Now <code>initial_step_size</code> can be specified as a keyword in <code>find_good_stepsize</code> if you want more control of the step size selection process.</p>
<p>And finally, we have a few new examples of normalising flows in the NormalizingFlows.jl library: https://github.com/TuringLang/NormalizingFlows.jl/tree/main/example</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-06-06-newsletter-8/</guid>
  <pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 7</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-05-23-newsletter-7/</link>
  <description><![CDATA[ 





<p><strong>MCMCChains@7</strong></p>
<p>There’s a new major version of <a href="https://github.com/TuringLang/MCMCChains.jl">MCMCChains.jl</a>. From a user point of view, the main difference is that summary statistics and quantiles aren’t automatically calculated by default (so, printing a <code>Chains</code> object in a REPL will only show the parameter names and sizes). To get the summary statistics and quantiles you will have to run <code>describe(chain)</code>. The main reason for this is because the summary stats would often take quite a while to compute — if you wish to preserve the old behaviour you can stick to MCMCChains@6.</p>
<p><strong>JuliaBUGS <code>@model</code></strong></p>
<p><a href="https://github.com/TuringLang/JuliaBUGS.jl">JuliaBUGS.jl</a> recently implemented a <code>@model</code> macro which, in terms of its syntax, looks somewhat similar to Turing.jl’s own macro, but under the hood constructs a BUGS model. Perhaps of interest is the way that parameters are initialised using <code>@parameters struct ... end</code>; this currently helps to initialise all parameter values to placeholders, and offers an alternative to explicitly specifying this with NamedTuples or arrays. This hasn’t yet been released but for more information and a demonstration, there’s <a href="https://github.com/TuringLang/JuliaBUGS.jl/blob/main/docs/src/julia_syntax.md">a documentation page</a> that describes the design of this macro. The existing <code>@bugs</code> macro will still be retained.</p>
<p><strong>Libtask</strong></p>
<p><a href="https://github.com/TuringLang/Libtask.jl">Libtask.jl</a>, the library that Turing’s particle Gibbs sampler is built on, was recently rewritten for its core parts by Will Tebbutt (<a href="https://github.com/TuringLang/Libtask.jl/pull/179">#179</a>. Libtask implements copyable, resumable tasks (coroutines) in pure Julia, and the new version is much faster and better documented. The new implementation is based on source code transformations, using tools and techniques from <a href="https://github.com/chalk-lab/Mooncake.jl">Mooncake.jl</a>. <a href="https://github.com/TuringLang/AdvancedPS.jl/pull/114">Work</a> is ongoing to adapt AdvancedPS.jl to work with the new Libtask version, and once that is done we should expect a performance boost for Turing’s particle Gibbs sampler. We’ll let you know once that’s out.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-05-23-newsletter-7/</guid>
  <pubDate>Fri, 23 May 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 6</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-05-09-newsletter-6/</link>
  <description><![CDATA[ 





<p>Turing v0.38 has just been released and incorporates the changes from DynamicPPL which were mentioned <a href="../../../news/posts/2025-04-25-newsletter-5">in the last newsletter</a>. It also contains a fix for the Gibbs sampler, so that you can now specify arbitrary VarNames for each sampler (previously, you could only specify single-symbol VarNames). For example, you can now specify the <code>a.x</code> and <code>b.x</code> VarNames here:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb1-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@model</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>()</span>
<span id="cb1-2">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Normal</span>()</span>
<span id="cb1-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">end</span></span>
<span id="cb1-4"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@model</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">outer</span>()</span>
<span id="cb1-5">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">to_submodel</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>())</span>
<span id="cb1-6">    b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">to_submodel</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>())</span>
<span id="cb1-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">end</span></span>
<span id="cb1-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sample</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">outer</span>(), <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Gibbs</span>(<span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@varname</span>(a.x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=&gt;</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">MH</span>(), <span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@varname</span>(b.x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=&gt;</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">MH</span>()), <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>)</span></code></pre></div></div>
<p>It is theoretically possible that this will be slow for VarNames that involve indexing (e.g.&nbsp;<code>x[1]</code>), although we don’t have an example of this yet. If you find anything you think should be faster, let us know.</p>
<p>One other minor point: <a href="https://turinglang.org/ADTests/">on ADTests</a> you can now hover over a model name to see its definition.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-05-09-newsletter-6/</guid>
  <pubDate>Fri, 09 May 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 5</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-04-25-newsletter-5/</link>
  <description><![CDATA[ 





<p><strong>DynamicPPL 0.36</strong></p>
<p>A new minor version of DynamicPPL brings with it a few changes especially to the behaviour of submodels. These have not yet percolated up to Turing.jl, but will soon be. Firstly, prefixing behaviour is changed: consider these models</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb1-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@model</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>()</span>
<span id="cb1-2">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Normal</span>()</span>
<span id="cb1-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">end</span></span>
<span id="cb1-4"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@model</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">outer</span>()</span>
<span id="cb1-5">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span>]</span>
<span id="cb1-6">    a[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">to_submodel</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>())</span>
<span id="cb1-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">end</span></span></code></pre></div></div>
<p>If you ran this model, you would find that the single random variable was called <code>a[1].x</code> — but this isn’t the <code>x</code> field of the <code>1</code>st element of <code>a</code>, it’s actually a variable whose name is literally just <code>Symbol("a[1].x")</code>. DynamicPPL changes this behaviour such that the variable is correctly recognised as the <code>x</code> field of the <code>1</code>st element of <code>a</code>. This means that if you are trying to, for example, condition on the variable, you can do:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">outer</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|</span> (<span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@varname</span>(a[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=&gt;</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>)</span></code></pre></div></div>
<p>On the topic of conditioning, you can now also correctly condition or fix variables in a model before using it as a submodel, as this example demonstrates:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb3-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@model</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>()</span>
<span id="cb3-2">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">Normal</span>()</span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">end</span></span>
<span id="cb3-4"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@model</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">outer</span>()</span>
<span id="cb3-5">    a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">to_submodel</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">inner</span>() <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|</span> (<span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">@varname</span>(x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=&gt;</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>))</span>
<span id="cb3-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">end</span></span></code></pre></div></div>
<p>Previously, if you wanted to do this, you would have to condition on <code>@varname(a.x)</code>, meaning that you’d need to know the prefix before conditioning it. The current system allows for more modular construction of nested models.</p>
<p>For more complete details, please see <a href="https://github.com/TuringLang/DynamicPPL.jl/releases/tag/v0.36.0">the release notes</a>.</p>
<p><strong>TuringBenchmarking.jl</strong></p>
<p>DynamicPPL 0.36 also brings new functionality that can be used for testing and benchmarking automatic differentiation on Turing models. This is what powers the <a href="https://turinglang.org/ADTests/">ADTests table</a>, which we shared last time round. (Psst — there are more examples now than before!)</p>
<p>For more information, see the docstring of <code>DynamicPPL.TestUtils.AD.run_ad</code> in <a href="https://turinglang.org/DynamicPPL.jl/stable/api/#DynamicPPL.TestUtils.AD.run_ad">the DynamicPPL docs</a>.</p>
<p>As a corollary of this, the AD benchmarking functionalities in TuringBenchmarking.jl are not really needed anymore. If you are using this package, we recommend that you switch over to use the functionality that’s directly built into DynamicPPL.</p>
<p><strong>AdvancedHMC compatibility with ComponentArrays</strong></p>
<p>AdvancedHMC had a fairly long-standing issue where it couldn’t always be used with ComponentArrays as the position / momentum. This has now been fixed; you can take a look at <a href="https://github.com/TuringLang/AdvancedHMC.jl/blob/459ebb8a10cc1bc7dbbc27ed79afa796c607697a/test/hamiltonian.jl#L77-L100">the test suite</a> to see examples of how they can be used together.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-04-25-newsletter-5/</guid>
  <pubDate>Fri, 25 Apr 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 4</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-04-11-newsletter-4/</link>
  <description><![CDATA[ 





<p><strong>Have you used Turing.jl?</strong></p>
<p>Given that you’re reading this, we hope so! We’re currently putting together a list of papers and other outputs (e.g.&nbsp;tutorials, presentations, …) which make use of Turing.jl. We’d love to have more examples, if you have any, please do get in touch (feel free to message me and I can forward it). Thank you!</p>
<p><strong>State of the AD</strong></p>
<p>Over the last few weeks we’ve been putting together a little project that tabulates the performance of different AD backends on a variety of Turing.jl models, and we’re now quite excited to share it: https://turinglang.org/ADTests/ This will hopefully help to answer the perennial question of whether you should stick with good old ForwardDiff, or whether you should try something else. Do note that (as of the time of writing) this table is still in alpha stage and there are a lot of details that have yet to be ironed out :slightly_smiling_face: However, suggestions are always welcome!</p>
<p><strong>JuliaBUGS.jl</strong></p>
<p>The BUGS (Bayesian inference Using Gibbs Sampling) language provides a declarative way to specify complex Bayesian statistical models. For years, implementations like WinBUGS, OpenBUGS, and JAGS have been widely used tools for researchers applying these models. JuliaBUGS.jl is a modern implementation of the BUGS language, aiming for full backwards compatibility with standard BUGS models, while also offering improved interoperability with the Julia ecosystem. (For details and examples of BUGS syntax, check out <a href="https://turinglang.org/JuliaBUGS.jl/dev/example/">the JuliaBUGS documentation</a>.)</p>
<p><a href="https://github.com/TuringLang/JuliaBUGS.jl/pull/278/">A recent experimental update</a> introduces significant performance improvements in JuliaBUGS: instead of relying solely on the previous graph-based approach, JuliaBUGS can now directly generate Julia code to compute the model’s log-density. This code generation technique can yield &gt;10x speedups compared to the graph-based method. Currently, this provides the most benefit for models with linear or hierarchical structures; support for state space models is planned for a future update.</p>
<p>To use it, run this after compiling your model:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode julia code-with-copy"><code class="sourceCode julia"><span id="cb1-1">JuliaBUGS.<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set_evaluation_mode</span>(your_model, JuliaBUGS.<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">UseGeneratedLogDensityFunction</span>())</span></code></pre></div></div>
<p>We would love for you to test out this new functionality! If you have any feedback, please do feel free to open a GitHub issue or discussion.</p>
<p><strong>Even more advanced HMC</strong></p>
<p>Lastly, we have a paper of our own to share on Hamiltonian Monte Carlo methods!</p>
<ul>
<li>Xu, K., &amp; Ge, H. (2024). Practical Hamiltonian Monte Carlo on Riemannian Manifolds via Relativity Theory. <em>Forty-First International Conference on Machine Learning.</em> https://openreview.net/pdf?id=Et8Pk97u4u and https://icml.cc/virtual/2024/poster/34558</li>
</ul>
<p>We will be looking to integrate these methods into Turing.jl in the future.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-04-11-newsletter-4/</guid>
  <pubDate>Fri, 11 Apr 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 3</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-03-28-newsletter-3/</link>
  <description><![CDATA[ 





<p><strong>Turing v0.37</strong></p>
<p>We’ve now released v0.37 of Turing. This includes a lot of new functionality from DynamicPPL 0.35, including the new (simplified) <code>.~</code> . It also cleans up the list of exported identifiers, and most notably, if you were using things from DynamicPPL, you will now also need to <code>import DynamicPPL</code> (or <code>using</code>).</p>
<p>More generally, it’s likely that from now on our releases will involve larger changes because we are aggregating more changes into a single minor version. We are, however, also committed to providing thorough release notes that will help users and library authors upgrade more easily! Release notes will be available on GitHub, and you can see the notes for <a href="https://github.com/TuringLang/Turing.jl/releases/">Turing 0.37</a> and <a href="https://github.com/TuringLang/DynamicPPL.jl/releases">DynamicPPL 0.35</a> here. If you have any trouble upgrading, just drop us a note.</p>
<p><strong>AD backend testing</strong></p>
<p>Right now we test a series of DynamicPPL models with several AD backends. It’s rather ad-hoc and we are currently drafting a more formal interface for testing AD backends with Turing models. It’s still early days but if you are an AD package developer and want to know what this means for integration with Turing, get in touch (easiest way: <a href="https://julialang.slack.com/team/U07DBR7C2LD">ping Penny on Slack</a>) 🙂</p>
<p><strong>Unified interface for optimisation algorithms</strong></p>
<p>There’s <a href="https://github.com/TuringLang/Turing.jl/issues/2509">an ongoing discussion about unifying the interface</a> for MAP/MLE point estimates and variational inference (and potentially even MCMC). If you use more than one of these methods and have thoughts on what you’d like from an interface, we’d be very happy to hear from you!</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-03-28-newsletter-3/</guid>
  <pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Turing.jl Newsletter 2</title>
  <dc:creator>The TuringLang team</dc:creator>
  <link>https://turinglang.org/news/posts/2025-03-14-newsletter-2/</link>
  <description><![CDATA[ 





<p><strong>DynamicPPL benchmarking</strong></p>
<p>DynamicPPL.jl now has a set of benchmarks that are run on GitHub Actions! We measure how long it takes to evaluate a small selection of models and also to run AD on them. If you think that there are specific models / features that we should add to the benchmarks, please feel free to <a href="https://github.com/TuringLang/DynamicPPL.jl/issues/new">create an issue</a> and let us know.</p>
<p>Separately, we are planning to merge the benchmarking utilities in <a href="https://github.com/TuringLang/TuringBenchmarking.jl">TuringBenchmarking.jl</a> into DynamicPPL itself. There might be a little bit of API shake-up as part of this, but it’s for the better as it’ll allow the benchmarking code to more easily stay in sync with DynamicPPL — allowing us to catch performance regressions in PRs.</p>
<p><strong>SSMProblems</strong></p>
<p>The SSMProblems.jl and GeneralisedFilters.jl packages have now been merged into a single repository: <a href="https://github.com/TuringLang/SSMProblems.jl">https://github.com/TuringLang/SSMProblems.jl</a>. This won’t affect you if you are using the packages from the Julia General registry, but if you’re looking to develop off the main branch you may have to use a different URL, or specify a subdirectory in <code>Pkg.add</code>.</p>
<p><strong>Smaller bits</strong></p>
<p>Other code changes that have been merged:</p>
<ul>
<li>Some old code in AdvancedHMC.jl has been cleaned up quite a bit. See the <a href="https://github.com/TuringLang/AdvancedHMC.jl/releases/tag/v0.7.0">0.7.0 release</a> for more information.</li>
<li>Turing’s Gibbs sampler <a href="https://github.com/TuringLang/Turing.jl/pull/2502">now supports warmup steps properly</a>. We’re still thinking about how to properly encode the scenario where different sub-samplers have different numbers of warmup steps, if you have any ideas, do get in touch on that PR.</li>
<li>We are going to formally remove support for Zygote as an AD backend. We don’t test it thoroughly in Turing’s test suite. You can of course still use Zygote yourself, simply load <code>ADTypes.AutoZygote()</code> —&nbsp;although we can’t guarantee that we will fix any bugs that arise.</li>
</ul>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>Newsletter</category>
  <guid>https://turinglang.org/news/posts/2025-03-14-newsletter-2/</guid>
  <pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
