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.
1.1 Gallery programs¶
| 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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
bugs on lkj_cholesky_correlation reports:
family:MatrixNormal
Refused for: axes/matrix_kronecker.
Renders on: church, edward2, gen, numpyro, pymc, pyro, stan, turing, webppl.
Reported kinds:
bugs on axes/matrix_kronecker reports:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.