Skip to content

Transpilation support

This page is measured, not written

python -m tests.transpile.support_matrix calls quivers.transpile.transpile once per (program, backend) pair and writes this file from the outcomes. Every refusal quoted below is the runtime's own message, copied verbatim from the UnsupportedConstruct it raised. A drift test regenerates the page and fails when the result differs from what is committed.

transpile(module, target=...) has 11 registered backends. Given a program it either returns target source bytes or raises UnsupportedConstruct naming the constructs it cannot represent. This page records which of the two happens, for the 46 programs of the examples gallery and for 49 construct fixtures, each isolating a single QVR surface construct.

Support is thus stated as a refusal boundary rather than as a feature list. A construct no backend accepts is a limit of the export surface itself, and reaching any target means writing the model differently; a construct one backend alone refuses is a limit of that target, and another target may take the program unchanged. Sections 2 and 3 separate the two, since the remedies differ.

Refusals are grouped by construct, not by program: the heading of each group is the identifier prefix of the reported UnsupportedConstruct.kinds, which is what a reader asking whether a feature of their own model is supported wants to match on.

QIEC uses the same measured renderer boundary as probabilistic programs. Its complete checked module is retained as typed IRQiecModule nodes. Pyro, NumPyro, PyMC, Edward2, Turing, Gen, WebPPL, and Church emit named QIEC functions through a shared stable-ID runtime ABI. Stan, BUGS, and JAGS emit the closed, monomorphic, effect-free scalar Return/Bind fragment and report unsupported forms as qiec:capability:<feature>:<computation>.

What this page does not cover is whether a rendered program's density agrees with QVR's own. That is the subject of the transpilation-correctness contract, which states the evidence available for the programs that do render, and of the transpilation architecture, which describes how a program reaches a target at all.

Coverage at a glance

Backend Gallery programs Constructs
bugs 26 / 46 39 / 49
church 24 / 46 43 / 49
edward2 31 / 46 43 / 49
gen 31 / 46 43 / 49
jags 30 / 46 40 / 49
numpyro 32 / 46 43 / 49
pymc 31 / 46 43 / 49
pyro 32 / 46 43 / 49
stan 32 / 46 41 / 49
turing 31 / 46 43 / 49
webppl 32 / 46 43 / 49

Each backend links to its transpilation-correctness page, which documents the structure it emits, the parameter conversions it applies, and the evidence exercised for it.

1. Can this backend take my program?

yes means transpile returned bytes; no means it raised UnsupportedConstruct. Sections 2 and 3 give the reason behind every no.

Program bugs church edward2 gen jags numpyro pymc pyro stan turing webppl
ar1 yes yes yes yes yes yes yes yes yes yes yes
bayesian_regression yes yes yes yes yes yes yes yes yes yes yes
beta_binomial_ab_test no no yes yes yes yes yes yes yes yes yes
beta_regression yes yes yes yes yes yes yes yes yes yes yes
bidirectional_rnn_lm no no no no no no no no no no no
bnn no no no no no no no no no no no
ccg yes yes yes yes yes yes yes yes yes yes yes
changepoint yes yes yes yes yes yes yes yes yes yes yes
continuous_hmm yes yes yes yes yes yes yes yes yes yes yes
custom_rules yes yes yes yes yes yes yes yes yes yes yes
deep_markov no no no no no no no no no no no
factor_analysis yes yes yes yes yes yes yes yes yes yes yes
gamma_regression yes yes yes yes yes yes yes yes yes yes yes
gru_lm no no no no no no no no no no no
half_student_t_hierarchical yes no yes yes yes yes yes yes yes yes yes
hmm no no no no no yes no yes yes no yes
horseshoe_regression yes yes yes yes yes yes yes yes yes yes yes
irt_2pl yes yes yes yes yes yes yes yes yes yes yes
kumaraswamy_bounded_outcome no no yes yes yes yes yes yes yes yes yes
lda yes yes yes yes yes yes yes yes yes yes yes
linear_gaussian_ssm yes yes yes yes yes yes yes yes yes yes yes
lkj_cholesky_correlation no no yes yes no yes yes yes yes yes yes
logistic_noise_regression yes no yes yes yes yes yes yes yes yes yes
lstm_lm no no no no no no no no no no no
mixture_model no no yes yes yes yes yes yes yes yes yes
montague_nli no no no no no no no no no no no
multimodal_tlg yes yes yes yes yes yes yes yes yes yes yes
negbin_regression yes yes yes yes yes yes yes yes yes yes yes
parametric_pooling yes yes yes yes yes yes yes yes yes yes yes
pcfg yes yes yes yes yes yes yes yes yes yes yes
pmcfg yes yes yes yes yes yes yes yes yes yes yes
pmf no no no no no no no no no no no
ppca yes yes yes yes yes yes yes yes yes yes yes
quantifier_scope yes yes yes yes yes yes yes yes yes yes yes
schema_chart_parser no no no no no no no no no no no
seq2seq no no no no no no no no no no no
stochastic_volatility yes yes yes yes yes yes yes yes yes yes yes
survival_weibull yes yes yes yes yes yes yes yes yes yes yes
tensor_contraction no no no no no no no no no no no
term_autoencoder no no no no no no no no no no no
transformer_lm no no no no no no no no no no no
tree_categorical yes no yes yes yes yes yes yes yes yes yes
type_logical yes yes yes yes yes yes yes yes yes yes yes
vae no no no no no no no no no no no
vanilla_rnn_lm no no no no no no no no no no no
zip_regression no yes yes yes yes yes yes yes yes yes yes

1.2 Constructs

One minimal program per surface construct, so a no here isolates the construct rather than the model that used it.

1.2.1 Declarations

Program bugs church edward2 gen jags numpyro pymc pyro stan turing webppl
statements/bundle_decl yes yes yes yes yes yes yes yes yes yes yes
statements/category_decl yes yes yes yes yes yes yes yes yes yes yes
statements/composition_decl yes yes yes yes yes yes yes yes yes yes yes
statements/contraction_decl yes yes yes yes yes yes yes yes yes yes yes
statements/decoder_decl no no no no no no no no no no no
statements/deduction_decl yes yes yes yes yes yes yes yes yes yes yes
statements/encoder_decl no no no no no no no no no no no
statements/export_decl yes yes yes yes yes yes yes yes yes yes yes
statements/let_decl yes yes yes yes yes yes yes yes yes yes yes
statements/loss_decl no no no no no no no no no no no
statements/morphism_decl_init_family yes yes yes yes yes yes yes yes yes yes yes
statements/object_decl_finset yes yes yes yes yes yes yes yes yes yes yes
statements/object_decl_real yes yes yes yes yes yes yes yes yes yes yes
statements/program_decl_scalar yes yes yes yes yes yes yes yes yes yes yes
statements/qiec_computation_decl yes yes yes yes yes yes yes yes yes yes yes
statements/qiec_effectful_computation no yes yes yes no yes yes yes no yes yes
statements/rule_decl yes yes yes yes yes yes yes yes yes yes yes
statements/schema_decl yes yes yes yes yes yes yes yes yes yes yes
statements/signature_decl yes yes yes yes yes yes yes yes yes yes yes

1.2.2 Program steps

Program bugs church edward2 gen jags numpyro pymc pyro stan turing webppl
steps/call_step no yes yes yes no yes yes yes no yes yes
steps/let_step yes yes yes yes yes yes yes yes yes yes yes
steps/marginalize_step no yes yes yes yes yes yes yes yes yes yes
steps/observe_step yes yes yes yes yes yes yes yes yes yes yes
steps/return_step yes yes yes yes yes yes yes yes yes yes yes
steps/sample_step yes yes yes yes yes yes yes yes yes yes yes
steps/score_step yes yes yes yes yes yes yes yes yes yes yes

1.2.3 Let-expressions

Program bugs church edward2 gen jags numpyro pymc pyro stan turing webppl
let_expressions/let_expr_binop yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_call yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_factor yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_index yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_lambda yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_list yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_literal yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_method_call no no no no no no no no no no no
let_expressions/let_expr_string yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_unary yes yes yes yes yes yes yes yes yes yes yes
let_expressions/let_expr_var yes yes yes yes yes yes yes yes yes yes yes

1.2.4 Option values

Program bugs church edward2 gen jags numpyro pymc pyro stan turing webppl
options/option_call no no no no no no no no no no no
options/option_flag yes yes yes yes yes yes yes yes yes yes yes
options/option_list yes yes yes yes yes yes yes yes yes yes yes
options/option_name yes yes yes yes yes yes yes yes yes yes yes
options/option_number yes yes yes yes yes yes yes yes yes yes yes
options/option_string no no no no no no no no no no no

1.2.5 Axis specifications

Program bugs church edward2 gen jags numpyro pymc pyro stan turing webppl
axes/gp_event_axis yes yes yes yes yes yes yes yes yes yes yes
axes/matrix_kronecker no yes yes yes no yes yes yes yes yes yes
axes/scalar_iid_plate yes yes yes yes yes yes yes yes yes yes yes
axes/scalar_implicit yes yes yes yes yes yes yes yes yes yes yes
axes/vector_event_axis yes yes yes yes yes yes yes yes yes yes yes
axes/vector_over_iid yes yes yes yes yes yes yes yes yes yes yes

2. What no backend supports

Each construct below is refused by all 11 backends, so it marks the boundary of what QVR exports at all rather than a gap in one target. Reaching a target means writing the model differently, not switching language.

composition_decl

Refused for: pmf.

Reported kinds:

composition_decl

Each backend words it differently; this is bugs's. bugs on pmf reports:

the module's `composition_decl` declaration declares a composition rule: the algebra (its `tensor_op`, `join`, `unit` and `zero`) that says how morphism scores combine when morphisms are composed. It is structure over the whole module, not a random variable and not a step. A probabilistic-programming target has statements for declaring data and parameters, drawing a variable from a distribution, and adding a term to the log density; BUGS has none for declaring the algebra a category composes in. This module also declares no `program`, so there is no probabilistic program here to transpile in its place. A composition rule has no counterpart to emit. Add a `program ... :` block to the module and the rule is carried as module metadata while that program is transpiled; to run the rule itself, evaluate the module in quivers, which is where composition rules have meaning.

composition_decl, contraction_decl

Refused for: tensor_contraction.

Reported kinds:

composition_decl
contraction_decl

Each backend words it differently; this is bugs's. bugs on tensor_contraction reports:

bugs cannot transpile this program:
  - the module's `composition_decl` declaration declares a composition rule: the algebra (its `tensor_op`, `join`, `unit` and `zero`) that says how morphism scores combine when morphisms are composed. It is structure over the whole module, not a random variable and not a step. A probabilistic-programming target has statements for declaring data and parameters, drawing a variable from a distribution, and adding a term to the log density; BUGS has none for declaring the algebra a category composes in. This module also declares no `program`, so there is no probabilistic program here to transpile in its place. A composition rule has no counterpart to emit. Add a `program ... :` block to the module and the rule is carried as module metadata while that program is transpiled; to run the rule itself, evaluate the module in quivers, which is where composition rules have meaning.
  - the module's `contraction_decl` declaration declares a contraction: a morphism built by folding several input morphisms together over their shared axes, with the product and sum of the fold taken from the `rule=` composition rule it names. Its meaning lives entirely in that algebra. A probabilistic-programming target has statements for declaring data and parameters, drawing a variable from a distribution, and adding a term to the log density; BUGS has none for a morphism defined by contracting other morphisms over an algebra's fold. This module also declares no `program`, so there is no probabilistic program here to transpile in its place. A contraction has no counterpart to emit. Write the quantities you want scored as explicit `sample` / `observe` steps of a `program ... :` block, or evaluate the contraction in quivers and pass its result in as data.

loss_decl

Refused for: options/option_call, options/option_string, statements/loss_decl.

Reported kinds:

loss_decl

Each backend words it differently; this is bugs's. bugs on options/option_call reports:

the module's `loss_decl` declaration declares a training objective attached to a program, a deduction, an encoder or a decoder. A loss is something an optimiser minimises, not a term of the model's density. A probabilistic-programming target has statements for declaring data and parameters, drawing a variable from a distribution, and adding a term to the log density; BUGS has none for an optimisation objective separate from the joint it scores. This module also declares no `program`, so there is no probabilistic program here to transpile in its place. If the term belongs in the density, write it as a `score` step inside the program; if it is an optimiser objective, keep it in quivers, which is where training happens.

param-source:mlp

Refused for: bnn, deep_markov, seq2seq, transformer_lm, vae.

Reported kinds:

param-source:mlp

Every backend reports it in the same words. bugs on bnn reports:

no transpile target can transpile this program:
  - no transpile target can transpile this program. The refusal is tagged `morphism 'net' draws its parameters from a 'mlp' network. The network's weights are model-internal and appear in neither the wire form nor the sample sites, so no backend can reconstruct the mean the morphism computes at line 33. Express the network as explicit sampled weights and a deterministic forward pass, or write the step as a `sample` / `observe` against a closed-form family.`, which has no explanation registered yet; please report it.
  - a morphism draws its parameters from a `mlp` network, whose weights are not sites the program declares, so no target can reconstruct the parameter it computes. Express the network as explicit sampled weights and a deterministic forward pass, or write the step as a `sample` / `observe` against a closed-form family.

qiec:capability:neural-attachment:dec, qiec:capability:neural-attachment:dec__nll, qiec:capability:neural-attachment:enc

Refused for: statements/decoder_decl.

Reported kinds:

qiec:capability:neural-attachment:dec
qiec:capability:neural-attachment:dec__nll
qiec:capability:neural-attachment:enc

Each backend words it differently; this is bugs's. bugs on statements/decoder_decl reports:

bugs cannot transpile this program:
  - QIEC computation `dec` requires the `neural-attachment` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `dec__nll` requires the `neural-attachment` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `enc` requires the `neural-attachment` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

qiec:capability:neural-attachment:enc

Refused for: statements/encoder_decl.

Reported kinds:

qiec:capability:neural-attachment:enc

Each backend words it differently; this is bugs's. bugs on statements/encoder_decl reports:

QIEC computation `enc` requires the `neural-attachment` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

qiec:capability:neural-attachment:reconstruct

Refused for: term_autoencoder.

Reported kinds:

qiec:capability:neural-attachment:reconstruct

Each backend words it differently; this is bugs's. bugs on term_autoencoder reports:

QIEC computation `reconstruct` requires the `neural-attachment` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

qiec:capability:search:Montague__run

Refused for: montague_nli.

Reported kinds:

qiec:capability:search:Montague__run

Each backend words it differently; this is bugs's. bugs on montague_nli reports:

QIEC computation `Montague__run` is a deduction's entry, which enumerates its derivations through a search handler that resumes once per alternative, and BUGS has no runtime for that search. Run the deduction on the reference machine with `run_deduction`, or keep the program's chart out of the transpiled model.

qiec:capability:search:PCFG__run

Refused for: let_expressions/let_expr_method_call.

Reported kinds:

qiec:capability:search:PCFG__run

Each backend words it differently; this is bugs's. bugs on let_expressions/let_expr_method_call reports:

QIEC computation `PCFG__run` is a deduction's entry, which enumerates its derivations through a search handler that resumes once per alternative, and BUGS has no runtime for that search. Run the deduction on the reference machine with `run_deduction`, or keep the program's chart out of the transpiled model.

qiec:capability:search:lp_parser__run

Refused for: schema_chart_parser.

Reported kinds:

qiec:capability:search:lp_parser__run

Each backend words it differently; this is bugs's. bugs on schema_chart_parser reports:

QIEC computation `lp_parser__run` is a deduction's entry, which enumerates its derivations through a search handler that resumes once per alternative, and BUGS has no runtime for that search. Run the deduction on the reference machine with `run_deduction`, or keep the program's chart out of the transpiled model.

scan:no-lowering:fwd_cell

Refused for: bidirectional_rnn_lm.

Reported kinds:

scan:no-lowering:fwd_cell

Every backend reports it in the same words. bugs on bidirectional_rnn_lm reports:

`scan(fwd_cell)` threads `fwd_cell` across the positions of a sequence, so it denotes one draw per position over intermediate states the program never names. Writing that out needs a loop whose bound is the sequence length and one sample site per position, and the sequence axis is not an object this module declares: it arrives with the data, so there is no extent to size the loop from and no name to bind the per-position states to. Write the recurrence as a program over a declared axis, giving each position its own `sample` step, or unroll the chain into one `sample` per step.

scan:no-lowering:gru_cell

Refused for: gru_lm.

Reported kinds:

scan:no-lowering:gru_cell

Every backend reports it in the same words. bugs on gru_lm reports:

`scan(gru_cell)` threads `gru_cell` across the positions of a sequence, so it denotes one draw per position over intermediate states the program never names. Writing that out needs a loop whose bound is the sequence length and one sample site per position, and the sequence axis is not an object this module declares: it arrives with the data, so there is no extent to size the loop from and no name to bind the per-position states to. Write the recurrence as a program over a declared axis, giving each position its own `sample` step, or unroll the chain into one `sample` per step.

scan:no-lowering:lstm_cell

Refused for: lstm_lm.

Reported kinds:

scan:no-lowering:lstm_cell

Every backend reports it in the same words. bugs on lstm_lm reports:

`scan(lstm_cell)` threads `lstm_cell` across the positions of a sequence, so it denotes one draw per position over intermediate states the program never names. Writing that out needs a loop whose bound is the sequence length and one sample site per position, and the sequence axis is not an object this module declares: it arrives with the data, so there is no extent to size the loop from and no name to bind the per-position states to. Write the recurrence as a program over a declared axis, giving each position its own `sample` step, or unroll the chain into one `sample` per step.

scan:no-lowering:rnn_cell

Refused for: vanilla_rnn_lm.

Reported kinds:

scan:no-lowering:rnn_cell

Every backend reports it in the same words. bugs on vanilla_rnn_lm reports:

`scan(rnn_cell)` threads `rnn_cell` across the positions of a sequence, so it denotes one draw per position over intermediate states the program never names. Writing that out needs a loop whose bound is the sequence length and one sample site per position, and the sequence axis is not an object this module declares: it arrives with the data, so there is no extent to size the loop from and no name to bind the per-position states to. Write the recurrence as a program over a declared axis, giving each position its own `sample` step, or unroll the chain into one `sample` per step.

3. What each backend alone refuses

These are target gaps rather than language gaps: another backend renders the same program. Each quoted message is the one that backend raises, including whatever alternative it offers.

bugs

Every program below renders on at least one other backend and is refused here.

call:graph:noisy

Refused for: steps/call_step.

Renders on: church, edward2, gen, numpyro, pymc, pyro, turing, webppl.

Reported kinds:

call:graph:noisy

bugs on steps/call_step reports:

the program calls the computation `noisy` at run time, and BUGS is a graph language: a model is a set of stochastic and deterministic relations between named nodes, with no statement that runs a computation, draws under a site name it computes, or scores a weight it accumulates. A pure computation whose body is a chain of bindings is inlined before the plan reaches this target, so `noisy` is either effectful or recursive. Write its draws and scores as steps of the program, or transpile to a target with a host runtime.

family:BetaBinomial:no-bugs-distribution

Refused for: beta_binomial_ab_test.

Renders on: edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:BetaBinomial:no-bugs-distribution: the BUGS distribution catalogue has no beta-binomial, and the zeros trick that would write its closed-form marginal into the joint needs a data-bound carrier the BUGS language cannot declare (it has no `data { ... }` block)

bugs on beta_binomial_ab_test reports:

bugs cannot score a draw from `BetaBinomial`: the BUGS distribution catalogue has no beta-binomial, and the zeros trick that would write its closed-form marginal into the joint needs a data-bound carrier the BUGS language cannot declare (it has no `data { ... }` block)

family:Kumaraswamy:no-free-density-term

Refused for: kumaraswamy_bounded_outcome.

Renders on: edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:Kumaraswamy:no-free-density-term: the density is elementary in `log` and `pow`, but adding a written-out density to the joint needs a free log-density term the language has no statement for

bugs on kumaraswamy_bounded_outcome reports:

bugs cannot score a draw from `Kumaraswamy`: the density is elementary in `log` and `pow`, but adding a written-out density to the joint needs a free log-density term the language has no statement for

family:LKJCholesky

Refused for: lkj_cholesky_correlation.

Renders on: edward2, gen, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:LKJCholesky: no BUGS target name

bugs on lkj_cholesky_correlation reports:

bugs cannot score a draw from `LKJCholesky`: no BUGS target name

family:MatrixNormal

Refused for: axes/matrix_kronecker.

Renders on: church, edward2, gen, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:MatrixNormal: no BUGS target name

bugs on axes/matrix_kronecker reports:

bugs cannot score a draw from `MatrixNormal`: no BUGS target name

family:MixtureNormal:no-free-density-term

Refused for: mixture_model.

Renders on: edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:MixtureNormal:no-free-density-term: a finite mixture is an explicit weighted density in the BUGS function library, but adding one to the joint needs a free log-density term the language has no statement for

bugs on mixture_model reports:

bugs cannot score a draw from `MixtureNormal`: a finite mixture is an explicit weighted density in the BUGS function library, but adding one to the joint needs a free log-density term the language has no statement for

marginalize:grouped-fibration:cls

Refused for: steps/marginalize_step.

Renders on: church, edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

marginalize:grouped-fibration:cls: the rows `idx` sends to each `Item` are summed before the reduction over the atoms, and BUGS has no statement that adds the per-group log-density to the joint

bugs on steps/marginalize_step reports:

bugs cannot marginalize this latent out: the rows `idx` sends to each `Item` are summed before the reduction over the atoms, and BUGS has no statement that adds the per-group log-density to the joint

marginalize:no-collapse:z

Refused for: zip_regression.

Renders on: church, edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

marginalize:no-collapse:z: the scope is no categorical mixture, and BUGS has no statement that adds its integrated log-density to the joint

bugs on zip_regression reports:

bugs cannot marginalize this latent out: the scope is no categorical mixture, and BUGS has no statement that adds its integrated log-density to the joint

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

bugs on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and BUGS scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

qiec:capability:effectful-row:read, qiec:capability:perform:read

Refused for: statements/qiec_effectful_computation.

Renders on: church, edward2, gen, numpyro, pymc, pyro, turing, webppl.

Reported kinds:

qiec:capability:effectful-row:read
qiec:capability:perform:read

bugs on statements/qiec_effectful_computation reports:

bugs cannot transpile this program:
  - QIEC computation `read` requires the `effectful-row` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `read` requires the `perform` QIEC capability, but BUGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

church

Every program below renders on at least one other backend and is refused here.

family:BetaBinomial:no-church-target

Refused for: beta_binomial_ab_test.

Renders on: edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:BetaBinomial:no-church-target

church on beta_binomial_ab_test reports:

church has no `BetaBinomial` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

family:HalfStudentT:no-church-target

Refused for: half_student_t_hierarchical.

Renders on: bugs, edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:HalfStudentT:no-church-target

church on half_student_t_hierarchical reports:

church has no `HalfStudentT` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

family:Kumaraswamy:no-church-target

Refused for: kumaraswamy_bounded_outcome.

Renders on: edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:Kumaraswamy:no-church-target

church on kumaraswamy_bounded_outcome reports:

church has no `Kumaraswamy` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

family:LKJCholesky:no-church-target

Refused for: lkj_cholesky_correlation.

Renders on: edward2, gen, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:LKJCholesky:no-church-target

church on lkj_cholesky_correlation reports:

church has no `LKJCholesky` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

family:Logistic:no-church-target

Refused for: logistic_noise_regression.

Renders on: bugs, edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:Logistic:no-church-target

church on logistic_noise_regression reports:

church has no `Logistic` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

family:MixtureNormal:no-church-target

Refused for: mixture_model.

Renders on: edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:MixtureNormal:no-church-target

church on mixture_model reports:

church has no `MixtureNormal` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

let-expr:LetExprFactor:multi-axis-body

Refused for: tree_categorical.

Renders on: bugs, edward2, gen, jags, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

let-expr:LetExprFactor:multi-axis-body

church on tree_categorical reports:

a `factor` whose body ranges over more than one axis has no scheme-helper expression form: the product would have to be built by nested loops over a named array, and a `let` lowered to one expression has nowhere to put it. Split the factor into one per axis, or move the product into a plated `score` step.

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

church on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and Church scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

edward2

Every program below renders on at least one other backend and is refused here.

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

edward2 on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and Edward2 scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

gen

Every program below renders on at least one other backend and is refused here.

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

gen on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and Gen.jl scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

jags

Every program below renders on at least one other backend and is refused here.

call:graph:noisy

Refused for: steps/call_step.

Renders on: church, edward2, gen, numpyro, pymc, pyro, turing, webppl.

Reported kinds:

call:graph:noisy

jags on steps/call_step reports:

the program calls the computation `noisy` at run time, and JAGS is a graph language: a model is a set of stochastic and deterministic relations between named nodes, with no statement that runs a computation, draws under a site name it computes, or scores a weight it accumulates. A pure computation whose body is a chain of bindings is inlined before the plan reaches this target, so `noisy` is either effectful or recursive. Write its draws and scores as steps of the program, or transpile to a target with a host runtime.

family:no-target-name:LKJCholesky

Refused for: lkj_cholesky_correlation.

Renders on: edward2, gen, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:no-target-name:LKJCholesky

jags on lkj_cholesky_correlation reports:

jags has no `LKJCholesky` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

family:no-target-name:MatrixNormal

Refused for: axes/matrix_kronecker.

Renders on: church, edward2, gen, numpyro, pymc, pyro, stan, turing, webppl.

Reported kinds:

family:no-target-name:MatrixNormal

jags on axes/matrix_kronecker reports:

jags has no `MatrixNormal` distribution. Pick a family this target supports, or write the density you want as an explicit `score` step.

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

jags on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and JAGS scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

qiec:capability:effectful-row:read, qiec:capability:perform:read

Refused for: statements/qiec_effectful_computation.

Renders on: church, edward2, gen, numpyro, pymc, pyro, turing, webppl.

Reported kinds:

qiec:capability:effectful-row:read
qiec:capability:perform:read

jags on statements/qiec_effectful_computation reports:

jags cannot transpile this program:
  - QIEC computation `read` requires the `effectful-row` QIEC capability, but JAGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `read` requires the `perform` QIEC capability, but JAGS has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

numpyro

numpyro renders every program any other backend renders. Its remaining refusals are the language-level gaps of section 2.

pymc

Every program below renders on at least one other backend and is refused here.

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

pymc on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and PyMC scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

pyro

pyro renders every program any other backend renders. Its remaining refusals are the language-level gaps of section 2.

stan

Every program below renders on at least one other backend and is refused here.

qiec:capability:distribution:noisy, qiec:capability:effectful-row:noisy, qiec:capability:non-scalar-parameter:noisy, qiec:capability:perform:noisy, qiec:capability:site:noisy, qiec:capability:weight:noisy

Refused for: steps/call_step.

Renders on: church, edward2, gen, numpyro, pymc, pyro, turing, webppl.

Reported kinds:

qiec:capability:distribution:noisy
qiec:capability:effectful-row:noisy
qiec:capability:non-scalar-parameter:noisy
qiec:capability:perform:noisy
qiec:capability:site:noisy
qiec:capability:weight:noisy

stan on steps/call_step reports:

stan cannot transpile this program:
  - QIEC computation `noisy` requires the `distribution` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `noisy` requires the `effectful-row` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `noisy` requires the `non-scalar-parameter` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `noisy` requires the `perform` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `noisy` requires the `site` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `noisy` requires the `weight` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

qiec:capability:effectful-row:read, qiec:capability:perform:read

Refused for: statements/qiec_effectful_computation.

Renders on: church, edward2, gen, numpyro, pymc, pyro, turing, webppl.

Reported kinds:

qiec:capability:effectful-row:read
qiec:capability:perform:read

stan on statements/qiec_effectful_computation reports:

stan cannot transpile this program:
  - QIEC computation `read` requires the `effectful-row` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.
  - QIEC computation `read` requires the `perform` QIEC capability, but Stan has no semantics-preserving lowering for it. Choose a target whose QIEC capability set includes this feature, or change the computation; silently erasing it would change the program.

turing

Every program below renders on at least one other backend and is refused here.

marginalize:ungrouped-over-plate:state

Refused for: hmm.

Renders on: numpyro, pyro, stan, webppl.

Reported kinds:

marginalize:ungrouped-over-plate:state

turing on hmm reports:

`marginalize state` carries no index and no `over =` clause, so it declares one latent and every row of the plated `observe` inside it is conditioned on that single draw. Its density thus accumulates the body's rows and reduces over the latent once, and Turing.jl scores the rows the other way round, giving each its own draw. That is a different measure, not a different base measure, so it is refused rather than emitted. Give the latent the plate its rows share (`marginalize state : A`) or a grouping `over =` clause, either of which this target does emit correctly.

webppl

webppl renders every program any other backend renders. Its remaining refusals are the language-level gaps of section 2.