diff --git a/docs/site/_docs/api.md b/docs/site/_docs/api.md index 80f3a5116..7abd118f9 100644 --- a/docs/site/_docs/api.md +++ b/docs/site/_docs/api.md @@ -53,7 +53,7 @@ end ``` -source
+source
### # **`Turing.@~`** — *Macro*. @@ -71,7 +71,7 @@ Example: ``` -source
+source
@@ -93,7 +93,7 @@ Generic interface for implementing inference algorithms. An implementation of an Turing translates models to chunks that call the modelling functions at specified points. The dispatch is based on the value of a `sampler` variable. To include a new inference algorithm implements the requirements mentioned above in a separate file, then include that file at the end of this one. -source
+source
### # **`Turing.Gibbs`** — *Type*. @@ -111,7 +111,7 @@ alg = Gibbs(1000, HMC(1, 0.2, 3, :v1), PG(20, 1, :v2)) ``` -source
+source
### # **`Turing.HMC`** — *Type*. @@ -144,7 +144,7 @@ sample(gdemo([1.5, 2]), HMC(1000, 0.05, 10)) ``` -source
+source
### # **`Turing.HMCDA`** — *Type*. @@ -177,7 +177,7 @@ sample(gdemo([1.5, 2]), HMCDA(1000, 200, 0.65, 0.3)) ``` -source
+source
### # **`Turing.IPMCMC`** — *Type*. @@ -210,7 +210,7 @@ sample(gdemo([1.5, 2]), IPMCMC(100, 100, 4, 2)) ``` -source
+source
### # **`Turing.IS`** — *Type*. @@ -245,7 +245,7 @@ sample(gdemo([1.5, 2]), IS(1000)) ``` -source
+source
### # **`Turing.MH`** — *Type*. @@ -278,7 +278,7 @@ sample(gdemo([1.5, 2]), MH(1000, (:m, (x) -> Normal(x, 0.1)), :s))) ``` -source
+source
### # **`Turing.NUTS`** — *Type*. @@ -311,7 +311,7 @@ sample(gdemo([1.j_max, 2]), NUTS(1000, 200, 0.6j_max)) ``` -source
+source
### # **`Turing.PG`** — *Type*. @@ -344,7 +344,7 @@ sample(gdemo([1.5, 2]), PG(100, 100)) ``` -source
+source
### # **`Turing.PMMH`** — *Type*. @@ -363,7 +363,7 @@ alg = PMMH(100, SMC(20, :v1), MH(1,(:v2, (x) -> Normal(x, 1)))) ``` -source
+source
### # **`Turing.SGHMC`** — *Type*. @@ -391,7 +391,7 @@ sample(example, SGHMC(1000, 0.01, 0.1)) ``` -source
+source
### # **`Turing.SGLD`** — *Type*. @@ -419,7 +419,7 @@ sample(example, SGLD(1000, 0.5)) ``` -source
+source
### # **`Turing.SMC`** — *Type*. @@ -452,13 +452,69 @@ sample(gdemo([1.5, 2]), SMC(1000)) ``` -source
+source
+ + + + +## Data Structures + +### # **`Libtask.TArray`** — *Type*. + + +``` +TArray{T}(dims, ...) +``` + +Implementation of data structures that automatically perform copy-on-write after task copying. + +If current*task is an existing key in `s`, then return `s[current*task]`. Otherwise, return`s[current*task] = s[last*task]`. + +Usage: + +```julia +TArray(dim) +``` + +Example: + +```julia +ta = TArray(4) # init +for i in 1:4 ta[i] = i end # assign +Array(ta) # convert to 4-element Array{Int64,1}: [1, 2, 3, 4] +``` + + + + +## Utilities + +### # **`Libtask.tzeros`** — *Function*. + + +``` + tzeros(dims, ...) +``` + +Construct a distributed array of zeros. Trailing arguments are the same as those accepted by `TArray`. + +```julia +tzeros(dim) +``` + +Example: + +```julia +tz = tzeros(4) # construct +Array(tz) # convert to 4-element Array{Int64,1}: [0, 0, 0, 0] +``` ## Index +- [`Libtask.TArray`]({{site.baseurl}}/docs/library/#Libtask.TArray) - [`Turing.Gibbs`]({{site.baseurl}}/docs/library/#Turing.Gibbs) - [`Turing.HMC`]({{site.baseurl}}/docs/library/#Turing.HMC) - [`Turing.HMCDA`]({{site.baseurl}}/docs/library/#Turing.HMCDA) @@ -472,6 +528,7 @@ sample(gdemo([1.5, 2]), SMC(1000)) - [`Turing.SGLD`]({{site.baseurl}}/docs/library/#Turing.SGLD) - [`Turing.SMC`]({{site.baseurl}}/docs/library/#Turing.SMC) - [`Turing.Sampler`]({{site.baseurl}}/docs/library/#Turing.Sampler) +- [`Libtask.tzeros`]({{site.baseurl}}/docs/library/#Libtask.tzeros) - [`Turing.@model`]({{site.baseurl}}/docs/library/#Turing.@model) - [`Turing.@~`]({{site.baseurl}}/docs/library/#Turing.@~) diff --git a/docs/site/_docs/quick-start.md b/docs/site/_docs/quick-start.md deleted file mode 100644 index 23285f48d..000000000 --- a/docs/site/_docs/quick-start.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Probablistic Programming in Thirty Seconds -permalink: /docs/quick-start/ ---- - -If you are already well-versed in probabalistic programming and just want to take a quick look at how Turing's syntax works or otherwise just want a model to start with, we have provided a Bayesian coin-flipping model to play with. - - -This example can be run on however you have Julia installed (see [Getting Started](get-started.md)), but you will need to install the packages `Turing`, `Distributions`, `MCMCChain`, and `StatPlots` if you have not done so already. - - -This is an excerpt from a more formal example introducing probabalistic programming which can be found in Jupyter notebook form [here](https://github.com/TuringLang/TuringTutorials/blob/master/0_Introduction.ipynb) or as part of the documentation website [here](0_Introduction.md). - - -```julia -# Import libraries. -using Turing, Distributions, MCMCChain, StatPlots, Random - -# Set the true probability of heads in a coin. -p_true = 0.5 - -# Iterate from having seen 0 observations to 100 observations. -Ns = 0:100; - -# Draw data from a Bernoulli distribution, i.e. draw heads or tails. -Random.seed!(12) -data = rand(Bernoulli(p_true), last(Ns)) - -# Here's what the first five coin flips look like: -data[1:5] - -# Declare our Turing model. -@model coinflip(y) = begin - # Our prior belief about the probability of heads in a coin. - p ~ Beta(1, 1) - - # The number of observations. - N = length(y) - for n in 1:N - # Heads or tails of a coin are drawn from a Bernoulli distribution. - y[n] ~ Bernoulli(p) - end -end; - -# Settings of the Hamiltonian Monte Carlo (HMC) sampler. -iterations = 1000 -ϵ = 0.05 -τ = 10 - -# Start sampling. -chain = sample(coinflip(data), HMC(iterations, ϵ, τ)); - -# Construct summary of the sampling process for the parameter p, i.e. the probability of heads in a coin. -p_summary = Chains(chain[:p]) -histogramplot(p_summary) -``` - diff --git a/docs/site/_includes/feature_row b/docs/site/_includes/feature_row index 89dfc1b47..46037c8b8 100644 --- a/docs/site/_includes/feature_row +++ b/docs/site/_includes/feature_row @@ -31,6 +31,17 @@ {% endif %} + {% if f.i_class %} + +
+ + {% if f.image_caption %} + {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
+ {% endif %} +
+
+ {% endif %} +
{% if f.title %}

{{ f.title }}

@@ -46,8 +57,18 @@

{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

{% endif %}
+ + {% if f.code_chunk %} +
+
+
+                {{ f.code_chunk }}
+              
+
+
+ {% endif %} {% endfor %} - \ No newline at end of file + diff --git a/docs/site/_includes/page__hero.html b/docs/site/_includes/page__hero.html index 98bff72aa..cdb26a72f 100644 --- a/docs/site/_includes/page__hero.html +++ b/docs/site/_includes/page__hero.html @@ -59,7 +59,7 @@

{% else %} {% assign url = action.url | relative_url %} {% endif %} - {{ action.label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }} + {{ action.label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }} {% endfor %} {% endif %} diff --git a/docs/site/_sass/minimal-mistakes/_archive.scss b/docs/site/_sass/minimal-mistakes/_archive.scss index ae1ff4ab0..da31b3883 100644 --- a/docs/site/_sass/minimal-mistakes/_archive.scss +++ b/docs/site/_sass/minimal-mistakes/_archive.scss @@ -63,6 +63,7 @@ position: relative; border-radius: $border-radius; overflow: hidden; + text-align: center; img { width: 100%; @@ -331,6 +332,33 @@ } } } + + &--center-left { + float: left; + margin-left: 0; + margin-right: 0; + width: 100%; + clear: both; + font-size: 1.0em; + + .archive__item-teaser { + margin-bottom: 2em; + } + + @include breakpoint($small) { + text-align: center; + + .archive__item-teaser { + margin: 0 auto; + width: span(5 of 12); + } + + .archive__item-body { + margin: 0 auto; + width: span(7 of 12); + } + } + } } /* Place inside an archive layout */ @@ -365,4 +393,4 @@ padding-right: 0; } } -} \ No newline at end of file +} diff --git a/docs/site/_sass/minimal-mistakes/_buttons.scss b/docs/site/_sass/minimal-mistakes/_buttons.scss index e4394a193..dd744b265 100644 --- a/docs/site/_sass/minimal-mistakes/_buttons.scss +++ b/docs/site/_sass/minimal-mistakes/_buttons.scss @@ -33,6 +33,7 @@ (primary, $primary-color), (inverse, #fff), (light-outline, transparent), + (dark-outline, transparent), (success, $success-color), (warning, $warning-color), (danger, $danger-color), @@ -46,11 +47,15 @@ &--#{$buttoncolor} { @include yiq-contrasted($color); @if ($buttoncolor == inverse) { - border: 1px solid $border-color; + border: 1px solid $inverse-border-color; } @if ($buttoncolor == light-outline) { border: 1px solid #fff; } + @if ($buttoncolor == dark-outline) { + border: 1px solid $text-color; + background-color: rgba(255, 255, 255, 0.5); + } &:visited { @include yiq-contrasted($color); @@ -95,4 +100,4 @@ &--small { font-size: $type-size-7; } -} \ No newline at end of file +} diff --git a/docs/site/_sass/minimal-mistakes/_page.scss b/docs/site/_sass/minimal-mistakes/_page.scss index 39cd57fcf..94678a6b5 100644 --- a/docs/site/_sass/minimal-mistakes/_page.scss +++ b/docs/site/_sass/minimal-mistakes/_page.scss @@ -138,9 +138,9 @@ margin-bottom: 2em; padding: 3em 0; @include clearfix; - background-size: cover; + background-size: 100% 40%; background-repeat: no-repeat; - background-position: center; + background-position: bottom; -webkit-animation: $intro-transition; animation: $intro-transition; -webkit-animation-delay: 0.25s; @@ -150,6 +150,10 @@ color: #fff; } + @include breakpoint($large) { + background-size: 100% 90%; + } + .wrapper { padding-left: 1em; padding-right: 1em; @@ -161,14 +165,18 @@ .page__title, .page__meta, - .page__lead, + .page__lead { + color: $text-color; + text-shadow: 1px 1px 4px rgba(#fff, 0.5); + } + .btn { - color: #fff; - text-shadow: 1px 1px 4px rgba(#000, 0.5); + color: $text-color; + text-shadow: 1px 1px 4px rgba(#fff, 0.5); } .page__lead { - max-width: $medium; + max-width: $small; } .page__title { diff --git a/docs/site/_sass/minimal-mistakes/_variables.scss b/docs/site/_sass/minimal-mistakes/_variables.scss index 73d4895cb..a9739c3f8 100644 --- a/docs/site/_sass/minimal-mistakes/_variables.scss +++ b/docs/site/_sass/minimal-mistakes/_variables.scss @@ -60,6 +60,7 @@ $code-background-color-dark: $light-gray !default; $text-color: $dark-gray !default; $muted-text-color: mix(#fff, $text-color, 35%) !default; $border-color: $lighter-gray !default; +$inverse-border-color: $text-color !default; $form-background-color: $lighter-gray !default; $footer-background-color: $lighter-gray !default; diff --git a/docs/site/_tutorials/0_Introduction.md b/docs/site/_tutorials/0_Introduction.md index f0954c137..330820e2b 100644 --- a/docs/site/_tutorials/0_Introduction.md +++ b/docs/site/_tutorials/0_Introduction.md @@ -1,7 +1,3 @@ ---- -title: Introduction to Turing -permalink: /:collection/:name/ ---- ## Introduction @@ -98,6 +94,9 @@ Which is 0.5 when $$\alpha = \beta$$, as we expect for a large enough number of The intuition about this definition is that the variance of the distribution will approach 0 with more and more samples, as the denominator will grow faster than will the numerator. More samples means less variance. ````julia +# Import StatsPlots for animating purposes. +using StatPlots + # This is required for plotting only. x = range(0, stop = 1, length = 100) @@ -112,7 +111,7 @@ animation = @animate for (i, N) in enumerate(Ns) updated_belief = Beta(prior_belief.α + heads, prior_belief.β + tails) # Plotting - plot(x, pdf.(Ref(updated_belief), x), + plot(updated_belief, size = (500, 250), title = "Updated belief after $$N observations", xlabel = "probability of heads", @@ -188,7 +187,7 @@ chain = sample(coinflip(data), HMC(iterations, ϵ, τ)); ```` [HMC] Finished with - Running time = 7.1547015269999985; + Running time = 5.213980837999997; Accept rate = 0.997; #lf / sample = 9.99; #evals / sample = 11.989; @@ -203,7 +202,7 @@ After finishing the sampling process, we can visualize the posterior distributio ````julia # Construct summary of the sampling process for the parameter p, i.e. the probability of heads in a coin. p_summary = Chains(chain[:p]) -plot(p_summary) +plot(p_summary, seriestype = :histogram) ```` @@ -218,8 +217,8 @@ N = length(data) heads = sum(data) updated_belief = Beta(prior_belief.α + heads, prior_belief.β + N - heads) -# Visualize a blue density plot of the approximate posterior distribution using HMC (see "Chain 1" in the legend). -p = plot(p_summary, DensityPlot, xlim = (0,1), legend = :best, w = 2, c = :blue) +# Visualize a blue density plot of the approximate posterior distribution using HMC (see Chain 1 in the legend). +p = plot(p_summary, seriestype = :density, xlim = (0,1), legend = :best, w = 2, c = :blue) # Visualize a green density plot of posterior distribution in closed-form. plot!(p, range(0, stop = 1, length = 100), pdf.(Ref(updated_belief), range(0, stop = 1, length = 100)), diff --git a/docs/site/_tutorials/figures/0_Introduction_9_1.svg b/docs/site/_tutorials/figures/0_Introduction_9_1.svg index b4f142641..2565d3f25 100644 --- a/docs/site/_tutorials/figures/0_Introduction_9_1.svg +++ b/docs/site/_tutorials/figures/0_Introduction_9_1.svg @@ -1,364 +1,314 @@ - + - + - - + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - -0 - - -250 - - -500 - - -750 - - -1000 - - -0.3 - - -0.4 - - -0.5 - - -0.6 - - -0.7 - - -0.8 - - -Param1 - - -Iteration - - -Sample value - - - - - - - - - - - - - - - - - - - - - - - - - - - -0.2 + +0.2 - -0.4 + +0.4 - -0.6 + +0.6 - -0.8 + +0.8 - -0 + +0 - -2 + +50 - -4 + +100 - -6 + +150 - -Param1 + +Param#1 - -Sample value + +Sample value - -Density + +Frequency - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/site/_tutorials/figures/1_GaussianMixtureModel_10_1.svg b/docs/site/_tutorials/figures/1_GaussianMixtureModel_10_1.svg new file mode 100644 index 000000000..ef1c9403e --- /dev/null +++ b/docs/site/_tutorials/figures/1_GaussianMixtureModel_10_1.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-4 + + +-2 + + +0 + + +2 + + +-6 + + +-4 + + +-2 + + +0 + + +Assignments on Synthetic Dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/site/_tutorials/figures/1_GaussianMixtureModel_1_1.svg b/docs/site/_tutorials/figures/1_GaussianMixtureModel_1_1.svg new file mode 100644 index 000000000..907cdf2e1 --- /dev/null +++ b/docs/site/_tutorials/figures/1_GaussianMixtureModel_1_1.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-4 + + +-2 + + +0 + + +2 + + +-6 + + +-4 + + +-2 + + +0 + + +Synthetic Dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/site/_tutorials/figures/1_GaussianMixtureModel_7_1.svg b/docs/site/_tutorials/figures/1_GaussianMixtureModel_7_1.svg new file mode 100644 index 000000000..421b4592e --- /dev/null +++ b/docs/site/_tutorials/figures/1_GaussianMixtureModel_7_1.svg @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +0 + + +25 + + +50 + + +75 + + +100 + + +-6 + + +-4 + + +-2 + + +0 + + +2 + + +Chain 1 + + +Iteration + + +Sample value + + + + + + + +mu 1 + + + +mu 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-6 + + +-4 + + +-2 + + +0 + + +2 + + +0.0 + + +0.5 + + +1.0 + + +1.5 + + +2.0 + + +2.5 + + +Chain 1 + + +Sample value + + +Density + + + + + + + +mu 1 + + + +mu 2 + + diff --git a/docs/site/_tutorials/figures/1_GaussianMixtureModel_9_1.svg b/docs/site/_tutorials/figures/1_GaussianMixtureModel_9_1.svg new file mode 100644 index 000000000..2601ab723 --- /dev/null +++ b/docs/site/_tutorials/figures/1_GaussianMixtureModel_9_1.svg @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-4 + + +-2 + + +0 + + +2 + + +-6 + + +-4 + + +-2 + + +0 + + +2 + + +Synthetic Dataset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +- + + +25.0 + + +- + + +22.5 + + +- + + +20.0 + + +- + + +17.5 + + +- + + +15.0 + + +- + + +12.5 + + +- + + +10.0 + + +- + + +7.5 + + +- + + +5.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +- + + +25.0 + + +- + + +22.5 + + +- + + +20.0 + + +- + + +17.5 + + +- + + +15.0 + + +- + + +12.5 + + +- + + +10.0 + + +- + + +7.5 + + +- + + +5.0 + + + + + + diff --git a/docs/site/assets/css/main.scss b/docs/site/assets/css/main.scss index 23346e773..80ba817c0 100644 --- a/docs/site/assets/css/main.scss +++ b/docs/site/assets/css/main.scss @@ -5,4 +5,4 @@ @charset "utf-8"; @import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin | default: 'default' }}"; // skin -@import "minimal-mistakes"; // main partials \ No newline at end of file +@import "minimal-mistakes"; // main partials diff --git a/docs/site/assets/mvnorm.svg b/docs/site/assets/mvnorm.svg new file mode 100644 index 000000000..564cbd8f6 --- /dev/null +++ b/docs/site/assets/mvnorm.svg @@ -0,0 +1,1375 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/site/assets/turing-logo-wide.svg b/docs/site/assets/turing-logo-wide.svg new file mode 100644 index 000000000..c96194585 --- /dev/null +++ b/docs/site/assets/turing-logo-wide.svg @@ -0,0 +1,45038 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/site/splash_page.md b/docs/site/splash_page.md new file mode 100644 index 000000000..e86b567aa --- /dev/null +++ b/docs/site/splash_page.md @@ -0,0 +1,63 @@ +--- +title: Turing.jl +layout: splash +permalink: /splash/ + +header: + # overlay_color: "#000" + # overlay_filter: "0.0" + btn_class: "btn--primary" + overlay_image: /assets/turing-logo-wide.svg + actions: + - label: "Get Started" + btn_class: "btn--primary" + url: "http://turing.ml/docs/get-started/" + - label: "Documentation" + url: "http://turing.ml/docs/" + - label: "Tutorials" + url: "http://turing.ml/tutorials/" +excerpt: "**Turing** is a universal probabilistic programming language with an intuitive modelling interface, composable probabilistic inference, and computational scalability." + +intro: + - excerpt: 'Turing provides Hamiltonian Monte Carlo and particle MCMC sampling algorithms for complex posterior distributions ideal for distributions involving discrete variables and stochastic control flows.' + +current-features: + - title: 'Current Features' + +main-feature_row: + - title: "Intuitive Syntax" + excerpt: "Turing models are easy to read and write. Specify models quickly and easily." + - title: "Universal" + excerpt: "Turing supports models with stochastic control flow — models work the way you write them." + - title: "Fully Hackable" + excerpt: "Turing is written fully in Julia, and can be modified to suit your needs." + +flux: + - image_path: "http://turing.ml/tutorials/figures/3_BayesNN_12_1.svg" + title: "Integrates With Other Deep Learning Packages" + excerpt: "Turing supports Julia's [Flux](http://fluxml.ai/) package for automatic differentiation. Combine Turing and Flux to construct probabalistic variants of traditional machine learning models." + url: "http://turing.ml/tutorials/3-bayesnn/" + btn_label: "Bayesian Neural Network Tutorial" + btn_class: "btn--inverse" + + +samplers: + - image_path: /assets/mvnorm.svg + title: "Large Sampling Library" + excerpt: "Turing provides Hamiltonian Monte Carlo sampling for differentiable posterior distributions, Particle MCMC sampling for complex posterior distributions involving discrete variables and stochastic control flow, and Gibbs sampling which combines particle MCMC, HMC and many other MCMC algorithms." + url: "http://turing.ml/docs/library/#samplers" + btn_label: "Samplers" + btn_class: "btn--inverse" + +citing: + - title: "Citing Turing" + - overlay_color: "#000" + - excerpt: 'If you use **Turing** for your own research, please consider citing the following publication: Hong Ge, Kai Xu, and Zoubin Ghahramani: **Turing: Composable inference for probabilistic programming.** AISTATS 2018 [pdf](http://proceedings.mlr.press/v84/ge18b.html) [bibtex](https://dblp.org/rec/bib2/conf/aistats/GeXG18.bib)' +--- + +{% include feature_row id="main-feature_row" %} +{% include feature_row id="samplers" type="left" %} +{% include feature_row id="flux" type="right" %} + + +{% include feature_row id="citing" type = "center-left" %}