# Truncated distributions in Gen

**URL:** <https://discourse.julialang.org/t/truncated-distributions-in-gen/50051>\
**Category:** Probabilistic Programming\
**Tags:** question\
**Created:** [November 12, 2020, 2:12pm UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051 "2020-11-12T14:12:27Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![dell\_parker](https://avatars.discourse-cdn.com/v4/letter/d/f6c823/32.png) [@dell\_parker](https://discourse.julialang.org/u/dell_parker)\
**Post date:** [November 12, 2020, 2:12pm UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051/1 "2020-11-12T14:12:27Z")

</div>

Is there a way to sample from a truncated distribution in Gen? In other words, what should go in `??` below?

```julia
using Gen, Distributions

@gen function line_model(xs::Vector{Float64})

    slope = @trace(??, :slope)
    intercept = @trace(normal(0, 2), :intercept)

    for (i, x) in enumerate(xs)
        @trace(normal(slope * x + intercept, 0.1), (:y, i))
    end

end;

xs = [-5., -4., -3., -2., -1., 0., 1., 2., 3., 4., 5.];
trace = Gen.simulate(line_model, (xs,));

```

I’ve tried:

1. `Distributions.Truncated(normal(0, 1), 0, Inf)`. I believe this doesn’t work because Gen’s `normal(0, 1)` returns a float.
2. I considered implementing this using `@dist`, but couldn’t formulate truncation as a deterministic transformation:

```julia
@dist function truncated_normal(mean, sd, lb, ub)
    max(lb, min(normal(mean, sd), ub))
end

```

Is there a way to implement `Truncated` from Distributions.jl for any distribution in Gen?

Thanks.

---

<div class="post-metadata">

**Author:** ![dell\_parker](https://avatars.discourse-cdn.com/v4/letter/d/f6c823/32.png) [@dell\_parker](https://discourse.julialang.org/u/dell_parker)\
**Post date:** [November 18, 2020, 10:26pm UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051/2 "2020-11-18T22:26:27Z")

</div>

Found a solution using [Genify](https://github.com/probcomp/Genify.jl).

Define:

```julia
function truncated_normal(mean, sd, lb, ub)
    d = Distributions.Truncated(Normal(mean, sd), lb, ub)
    x = rand(d)
end

```

and

`gen_truncated_normal = genify(truncated_normal, Real, Real, Real, Real)`

Then, modify the line in line\_model to:

`slope = @trace(gen_truncated_normal(0,1,0,Inf), :slope)`

---

<div class="post-metadata">

**Author:** ![Alex\_Lew](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alex_lew/32/21643_2.png) [@Alex\_Lew](https://discourse.julialang.org/u/Alex_Lew)\
**Post date:** [February 2, 2021, 8:42pm UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051/3 "2021-02-02T20:42:25Z")

</div>

Awesome! For people finding this now, you can also use the new [GitHub - probcomp/GenDistributions.jl: Use Distributions.jl distributions from within Gen](https://github.com/probcomp/GenDistributions.jl) package to call any Distributions.jl distribution from within a Gen model.

---

<div class="post-metadata">

**Author:** ![EvoArt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/evoart/32/25357_2.png) [@EvoArt](https://discourse.julialang.org/u/EvoArt)\
**Post date:** [February 20, 2021, 9:54am UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051/4 "2021-02-20T09:54:22Z")

</div>

Thanks, thats great!

---

<div class="post-metadata">

**Author:** ![dell\_parker](https://avatars.discourse-cdn.com/v4/letter/d/f6c823/32.png) [@dell\_parker](https://discourse.julialang.org/u/dell_parker)\
**Post date:** [April 11, 2021, 4:56pm UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051/5 "2021-04-11T16:56:32Z")

</div>

Sweet! Thanks so much, @Alex_Lew!

---

<div class="post-metadata">

**Author:** ![jling](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jling/32/212909_2.png) [@jling](https://discourse.julialang.org/u/jling)\
**Post date:** [June 23, 2023, 7:49am UTC](https://discourse.julialang.org/t/truncated-distributions-in-gen/50051/6 "2023-06-23T07:49:05Z")

</div>

can we register this pkg
