// Coefficient priors assume a = uniform_continuous(-2, 2); assume b = uniform_continuous(-2, 2); assume c = uniform_continuous(-2, 2); assume d = uniform_continuous(0, 3); assume e = uniform_continuous(0, 2*3.14159); // Mixture assume components = array( proc(x) { a*x + b }, proc(x) { c*sin(d*x + e) } ); assume weights = simplex(0.5, 0.5); assume true_f = categorical(weights, components); // Data (inline, in this case) define data_xs = array(8.73, 7.47, 0.11, 0.26, 3.94, 4.86, 4.07, 5.65, 9.1, 6.62, 9.98, 3.54, 8.12, 5.17, 5.39); define data_ys = array(0.53, 0.67, 0.23, 0.02, 0.13, 0.27, 0.33, 0.04, 0.68, 0.17, 0.1, 0.16, 0.53, 0.42, 0.4); define data = zip(data_xs, data_ys); // Function for programmatically observing the data define obs = proc(xy) { x = lookup(xy, 0); y = lookup(xy, 1); observe(normal(true_f(unquote(x)), 1.0), y) }; run(for_each(data, obs)); // Collect several snapshots of the progress of inference define xs = linspace(0, 10, 200); define yss = array_from_dataset(run(accumulate_dataset(10, do(mh(default, one, 50), collect(mapv(true_f, unquote(xs))))))); // Plot them plot_lines(xs, yss, data_xs, data_ys, -2, 2, 0.5, 1.0, 1.0);