# Using intermediate results in conditional Gibbs in Turing

**URL:** https://discourse.julialang.org/t/using-intermediate-results-in-conditional-gibbs-in-turing/58203
**Category:** Probabilistic Programming
**Created:** [March 30, 2021, 4:29am UTC](https://discourse.julialang.org/t/using-intermediate-results-in-conditional-gibbs-in-turing/58203 "2021-03-30T04:29:14Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![jbmuir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jbmuir/32/4798_2.png) [@jbmuir](https://discourse.julialang.org/u/jbmuir)
#### Post date: [March 30, 2021, 4:29am UTC](https://discourse.julialang.org/t/using-intermediate-results-in-conditional-gibbs-in-turing/58203/1 "2021-03-30T04:29:14Z")

</div>

I have a problem with an expensive intermediate computation that I have to use both within the normal model definition, and in a conditional Gibbs update - is there some way that I can reuse the computation directly in the conditional update?

Relevant subsections of code are (`M` is a potentially expensive operation)

```julia
        #this is inside the model definition
        μ = μ₀ .* exp.(M(l, σ, w))
        μi = S*μ
        Turing.@addlogprob! sum(log.(μi[x.==1])) - hatsum(μ)*params.M.h

```

and

```julia
    function cond_x_b_c(c, b::BranchingProcess{T}, catalog::Catalog{T}, M::MaternSPDE) where T
        μ = c.μ₀ .* exp.(M(c.l, c.σ, c.w))
        μi = S*μ
        update_weights!(b, catalog, μi, c.K, c.α, c.c, c.p̃+1)
        return Product([Categorical(b.bnodes[i].bweights) for i = 1:length(catalog.t)])
    end
    
    cond_x(c) = cond_x_b_c(c, b, catalog, params.M)

```

where I compute the same deterministic intermediate value `μi`.

---

<div class="post-metadata">

### Author: ![Carter](https://avatars.discourse-cdn.com/v4/letter/c/e480ec/32.png) [@Carter](https://discourse.julialang.org/u/Carter)
#### Post date: [April 7, 2021, 1:22pm UTC](https://discourse.julialang.org/t/using-intermediate-results-in-conditional-gibbs-in-turing/58203/2 "2021-04-07T13:22:49Z")

</div>

Would something like Memoization help your problem? The Turing docs have an example [here](https://turing.ml/dev/docs/using-turing/performancetips#reuse-computations-in-gibbs-sampling).

---

<div class="post-metadata">

### Author: ![jbmuir](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jbmuir/32/4798_2.png) [@jbmuir](https://discourse.julialang.org/u/jbmuir)
#### Post date: [July 2, 2021, 5:12am UTC](https://discourse.julialang.org/t/using-intermediate-results-in-conditional-gibbs-in-turing/58203/3 "2021-07-02T05:12:08Z")

</div>

After putting this on the backburner for a bit I came back to it and tried memoization - it seems like the cost of maintaining the cache exceeds the benefits of memoization, probably because w is a 129 element vector.
