How accurate is ideal constrained generation? For each problem, the rollouts that run without
error are exact samples from the validity-constrained posterior; ŝ is the fraction of them that are
correct, averaged one-problem-one-vote over the benchmark (0/0 := 0), together with the fraction of problems
with no valid rollout and the validity rate Z. 10 models × 6 temperatures, N = 100 rollouts per
problem (1 at t = 0), potential DS1000RuntimeNoErrorPotential, Matplotlib excluded (image-graded).
This page previously reported the pooled ratio Ŝ = ∑correct/∑valid as its headline
(“skyline”); see Definitions for why the macro estimate is the comparable reference
and below for the pooled numbers.
* Qwen2.5-Coder 7B, DeepSeek-Coder: externally ingested (# SOLUTION START/END convention).
Constraint (validity potential). A sample y is valid iff its code runs to completion under DS1000RuntimeNoErrorPotential — no runtime/syntax error and no timeout:
φ(y) = 1[ y passes DS1000RuntimeNoErrorPotential ] ∈ {0, 1}
An answer that runs but returns the wrong value is still valid — the constraint is “does it run”, not “is it correct”.
Constrained-generation target. Let p0(· | x) be the model’s sampling distribution for problem x at the given temperature. Enforcing the constraint defines the target (posterior) distribution
π(· | x) ∝ p0(· | x) · φ(·)
Rejection sampling realises π exactly: draw from p0, discard invalid samples, keep the valid ones. With N rollouts per problem, the accepted rollouts of problem x are exact draws from π(· | x).
Validity rate (normalizing constant). Estimated by simple Monte Carlo over the rollouts:
Z(x) = 𝔼p0(y|x)[ φ(y) ] = Pr( y valid | x ) ≈ Validx / N
where Validx is the number of valid rollouts of problem x. Z = meanx Z(x) is the benchmark-level validity rate.
Posterior accuracy of a problem. The quantity of interest is how often a sample from the constrained target is correct:
s(x) := Pr( y correct | y valid, x ) = Prπ(·|x)( y correct ) ≈ Correctx / Validx
Single-sample accuracy factorises as Pr(y correct | x) = Z(x) · s(x); averaged over problems it is the pass@1 of the DS-1000 page.
Posterior accuracy over the benchmark (headline). Treating the benchmark as a sample of problems x ~ D, the number we want is the expected posterior accuracy of a new problem,
s̄ := 𝔼x ~ D[ s(x) ] = 𝔼x[ Pr( y correct | y valid, x ) ]
estimated by the macro estimator — one problem, one vote — with the convention 0/0 := 0 for problems none of whose N rollouts is valid:
ŝ = meanx [ Correctx / Validx if Validx > 0, else 0 ]
ŝ is a consistent estimate of s̄. Each per-problem ratio is an unbiased estimate of s(x) given at least one valid sample, so at finite N the only bias is the 0/0 := 0 convention, which pulls ŝ down: it treats a problem whose validity rate is small but non-zero as if its posterior accuracy were zero. ŝ therefore tends to under-estimate s̄, by at most the fraction of zero-valid problems, which we report next to every ŝ. (The alternative of simply dropping the zero-valid problems is biased too — it is a ratio of two unbiased estimators and changes the population to “problems this model can make run” — and it hides how many problems the constraint could not touch; we show it only in the tables as ŝ+.)
Why not pool? Earlier versions of this page reported the pooled ratio
Ŝ = (∑x Correctx) / (∑x Validx) = pass@1 / Z
Ŝ is a consistent estimate of a different quantity,
S̄ := 𝔼[ Z(x) s(x) ] / 𝔼[ Z(x) ] = s̄ + Cov(Z, s) / 𝔼[ Z(x) ]
a validity-weighted average: every valid rollout gets one vote, so problems the model already handles well (high Z) dominate, and problems with Z(x) = 0 have no weight at all. Because Z and s are positively correlated on DS-1000 (problems that error more are also wrong more), Ŝ sits above s̄ — not through finite-sample bias but because it estimates the wrong thing. A fine-tuned or approximate sampler is scored by its macro pass@1 (one problem, one vote), so ŝ is the comparable reference. Ŝ is kept below as a secondary number because pass@1 = Z × Ŝ holds exactly on pooled estimates.
For each model and temperature (DS-1000, Matplotlib excluded) we report ŝ with a 95% bootstrap CI over problems (2000 resamples), the fraction of problems with no valid rollout, the validity rate Z, and the pooled Ŝ for reference.
ŝ = meanx Pr(correct | valid, x), 0/0 := 0 — the accuracy ideal constrained generation reaches on a new problem. It falls with temperature as the target π dilutes.
Each cell: ŝ, its 95% bootstrap CI, and how many problems had no valid rollout among the N sampled (these enter ŝ as 0). Greedy t=0 has N=1, so its zero-valid count is simply the number of erroring greedy answers. Browse the underlying rollouts in the explorer.
| model | t=0.0 | t=0.2 | t=0.4 | t=0.6 | t=0.7 | t=0.8 | t=1.0 |
|---|---|---|---|---|---|---|---|
| Llama-3 8B | 0.279 [0.249, 0.310] 296/845 zero-valid | 0.344 [0.314, 0.372] 62/845 zero-valid | 0.342 [0.315, 0.368] 26/845 zero-valid | 0.313 [0.289, 0.337] 11/845 zero-valid | – | 0.266 [0.245, 0.287] 7/844 zero-valid | 0.219 [0.199, 0.238] 13/845 zero-valid |
| Llama-3 8B Instruct | 0.257 [0.228, 0.288] 295/845 zero-valid | 0.326 [0.297, 0.356] 64/845 zero-valid | 0.337 [0.311, 0.365] 24/845 zero-valid | 0.330 [0.305, 0.356] 11/845 zero-valid | – | 0.316 [0.292, 0.340] 9/845 zero-valid | 0.293 [0.270, 0.315] 9/845 zero-valid |
| Llama-3.1 8B | 0.253 [0.225, 0.283] 279/845 zero-valid | 0.324 [0.295, 0.352] 63/845 zero-valid | 0.320 [0.295, 0.346] 24/845 zero-valid | 0.293 [0.270, 0.316] 11/845 zero-valid | – | 0.255 [0.233, 0.276] 8/845 zero-valid | 0.200 [0.182, 0.218] 15/845 zero-valid |
| Llama-3.1 8B Instruct | 0.230 [0.202, 0.258] 308/845 zero-valid | 0.295 [0.268, 0.324] 65/845 zero-valid | 0.312 [0.286, 0.339] 31/845 zero-valid | 0.302 [0.279, 0.327] 19/845 zero-valid | – | 0.281 [0.260, 0.303] 13/845 zero-valid | 0.246 [0.226, 0.265] 11/845 zero-valid |
| Llama-3.2 1B | 0.022 [0.013, 0.033] 691/845 zero-valid | 0.063 [0.049, 0.078] 303/845 zero-valid | 0.086 [0.071, 0.102] 127/845 zero-valid | 0.081 [0.068, 0.096] 93/845 zero-valid | – | 0.065 [0.053, 0.077] 83/845 zero-valid | 0.042 [0.032, 0.053] 214/845 zero-valid |
| Llama-3.2 1B Instruct | 0.043 [0.030, 0.057] 617/845 zero-valid | 0.091 [0.074, 0.108] 219/845 zero-valid | 0.098 [0.081, 0.114] 99/845 zero-valid | 0.098 [0.083, 0.113] 62/845 zero-valid | – | 0.078 [0.064, 0.091] 57/845 zero-valid | 0.070 [0.057, 0.084] 146/845 zero-valid |
| Qwen2.5-Coder 3B | 0.289 [0.259, 0.322] 269/845 zero-valid | 0.347 [0.319, 0.377] 46/845 zero-valid | 0.346 [0.320, 0.372] 16/845 zero-valid | 0.310 [0.287, 0.334] 6/845 zero-valid | – | 0.264 [0.244, 0.284] 3/845 zero-valid | 0.222 [0.204, 0.240] 6/845 zero-valid |
| Qwen2.5-Coder 3B Instruct | 0.318 [0.288, 0.351] 249/845 zero-valid | 0.386 [0.355, 0.419] 59/845 zero-valid | 0.390 [0.362, 0.420] 26/845 zero-valid | 0.372 [0.346, 0.398] 11/845 zero-valid | – | 0.342 [0.317, 0.365] 7/845 zero-valid | 0.298 [0.277, 0.319] 5/845 zero-valid |
| Qwen2.5-Coder 7B * | 0.388 [0.356, 0.421] 202/845 zero-valid | 0.443 [0.412, 0.473] 42/845 zero-valid | 0.438 [0.411, 0.465] 11/845 zero-valid | 0.410 [0.386, 0.436] 7/845 zero-valid | – | 0.364 [0.342, 0.387] 6/845 zero-valid | 0.309 [0.289, 0.329] 4/845 zero-valid |
| DeepSeek-Coder 6.7B * | 0.271 [0.241, 0.302] 281/845 zero-valid | 0.356 [0.326, 0.386] 67/845 zero-valid | 0.363 [0.336, 0.390] 30/845 zero-valid | 0.342 [0.318, 0.366] 10/845 zero-valid | – | 0.300 [0.279, 0.321] 9/845 zero-valid | 0.241 [0.223, 0.260] 4/845 zero-valid |
| Qwen3-Coder 30B FP8 * | – | – | – | 0.480 [0.452, 0.511] 33/845 zero-valid | – | – | – |
| Qwen3-Coder 30B FP8 raw+card-sampler * | – | – | – | – | 0.454 [0.425, 0.486] 97/845 zero-valid | – | – |
| Qwen3-Coder 30B FP8 card * | – | – | – | – | 0.290 [0.264, 0.317] 96/845 zero-valid | – | – |
| Qwen3-Coder 30B BF16 card * | – | – | – | – | 0.287 [0.262, 0.313] 97/845 zero-valid | – | – |
| Qwen3-Coder 30B BF16 few-shot * | – | – | – | – | 0.516 [0.485, 0.550] 131/845 zero-valid | – | – |
Fraction of problems where none of the N rollouts passed the constraint. These are the problems rejection sampling (and any sampler that only re-weights p0) cannot solve at this budget; they contribute 0 to ŝ and bound its downward bias.
One dot per model at the selected temperature (optionally within one library). The diagonal is P(V) = 1; a dot’s height above it is what enforcing the constraint buys.
Conditioning on validity: the completion runs without a runtime or syntax error (an AssertionError still counts as valid) — the potential DS1000RuntimeNoErrorPotential
x is the prior pass@1: the accuracy as sampled. y is the macro posterior accuracy ŝ = meanx Pr(correct | valid, x) (0/0 := 0): the accuracy of a sampler that draws exactly from the posterior the validity notion above defines, one problem one vote. Height above the diagonal is the gain; error bars are 95% bootstrap CIs (2000 resamples of the problem set) on both axes. Hovering a dot also shows two reference lines: the ray from the origin (its slope is the dot’s ŝ/pass@1 ratio) and the line through (1,1) (slope = the surviving-failure fraction).
Z is the proportion of rollouts that obey the constraint (run without error), Z = meanx Z(x) — the potential’s normalizing mass under the sampling distribution. Z collapses toward t=1.0 as more rollouts error out.
Ŝ = ∑ correct / ∑ valid = pass@1 / Z, the page’s former headline. It estimates 𝔼[Z s]/𝔼[Z], not 𝔼[s]; the gap to ŝ above is Cov(Z, s)/𝔼[Z] plus the zero-valid problems. Shown for continuity and because it factorises pass@1 exactly.
| model | t=0.0 | t=0.2 | t=0.4 | t=0.6 | t=0.7 | t=0.8 | t=1.0 |
|---|---|---|---|---|---|---|---|
| Llama-3 8B | 0.430 | 0.416 | 0.397 | 0.364 | – | 0.319 | 0.288 |
| Llama-3 8B Instruct | 0.395 | 0.389 | 0.379 | 0.366 | – | 0.351 | 0.344 |
| Llama-3.1 8B | 0.378 | 0.372 | 0.360 | 0.331 | – | 0.296 | 0.262 |
| Llama-3.1 8B Instruct | 0.361 | 0.364 | 0.355 | 0.340 | – | 0.323 | 0.314 |
| Llama-3.2 1B | 0.123 | 0.107 | 0.094 | 0.081 | – | 0.061 | 0.045 |
| Llama-3.2 1B Instruct | 0.158 | 0.165 | 0.145 | 0.127 | – | 0.103 | 0.103 |
| Qwen2.5-Coder 3B | 0.424 | 0.407 | 0.380 | 0.342 | – | 0.300 | 0.278 |
| Qwen2.5-Coder 3B Instruct | 0.451 | 0.458 | 0.444 | 0.419 | – | 0.390 | 0.360 |
| Qwen2.5-Coder 7B * | 0.510 | 0.503 | 0.478 | 0.448 | – | 0.405 | 0.371 |
| DeepSeek-Coder 6.7B * | 0.406 | 0.411 | 0.399 | 0.372 | – | 0.332 | 0.280 |
| Qwen3-Coder 30B FP8 * | – | – | – | 0.520 | – | – | – |
| Qwen3-Coder 30B FP8 raw+card-sampler * | – | – | – | – | 0.538 | – | – |
| Qwen3-Coder 30B FP8 card * | – | – | – | – | 0.305 | – | – |
| Qwen3-Coder 30B BF16 card * | – | – | – | – | 0.302 | – | – |
| Qwen3-Coder 30B BF16 few-shot * | – | – | – | – | 0.623 | – | – |
Four new columns for Qwen/Qwen3-Coder-30B-A3B-Instruct (MoE, 30.5B total / 3.3B active): the official FP8 release under the raw-completion sweep protocol and under its model-card serving (chat template, t=0.7, top_p 0.8, top_k 20, repetition penalty 1.05), and the unquantized BF16 model under model-card serving with the bare prompt and with a few-shot prompt. 100 samples × 1000 problems each; graded by the standard pipeline (official DS-1000 harness + no-runtime-error potential; chat answers extracted as the last fenced block). Hub: model=qwen3-coder-30b-a3b-*. All numbers below are non-Matplotlib macro.
| serving | ŝ (macro) | pass@1 | pass@100 | Z | #no-valid |
|---|---|---|---|---|---|
| FP8 · raw completion (sweep protocol, t=0.6) | 0.480 [0.452, 0.510] | 0.372 | 0.725 | 0.716 | 33 |
| FP8 · raw completion, card sampler (t=0.7) | 0.454 [0.425, 0.484] | 0.381 | 0.638 | 0.708 | 97 |
| FP8 · model-card chat, bare prompt (t=0.7) | 0.294 [0.266, 0.323] | 0.213 | 0.611 | 0.700 | 96 |
| BF16 · model-card chat, bare prompt (t=0.7) | 0.305 [0.270, 0.347] | 0.209 | 0.587 | 0.694 | 97 |
| BF16 · model-card chat, few-shot prompt (t=0.7) | 0.516 [0.484, 0.549] | 0.490 | 0.592 | 0.787 | 131 |
FP8 is measurement-free. The FP8 and BF16 bare-prompt cells agree on every metric (ŝ 0.294 vs 0.305; pass@1 0.213 vs 0.209) — the official FP8 quantization does not move DS-1000 results.
Format, not sampling. Model-card serving changes two things at once — the answer format (chat template) and the sampler (t=0.7, top_p 0.8, top_k 20, repetition penalty 1.05). The third row separates them: keeping raw completion and switching only the sampler moves pass@1 by +0.008 (0.372 → 0.381), while switching only the format at that same sampler moves it by -0.167 (0.381 → 0.213). The card cell’s deficit is answer-format, essentially none of it sampling. The card sampler does visibly concentrate, though, at unchanged format: pass@100 0.725 → 0.638 — the same coverage–concentration trade the few-shot prompt shows below, here from truncation (top_p 0.8 ∩ top_k 20) alone.
The two protocols put the same official problem text in front of the model in different ways, and the model answers in correspondingly different shapes:
Raw completion (the sweep protocol): the problem is fed as plain text to continue — no chat template — and generation stops at </code> / # SOLUTION END. The official prompt already ends inside the solution slot, so the model emits just the missing code, in DS-1000's native format. A typical complete answer:
result = df.iloc[List]
Model-card serving: the same problem is the user message of the chat template, sampled with the card's settings (t=0.7, top_p 0.8, top_k 20, repetition penalty 1.05). The instruct model answers conversationally; the graded answer must then be extracted (last fenced block). A typical answer to the same problem (abridged, real rollout):
Looking at this problem, I need to reorder the DataFrame rows based on a given list of indices. [...]
BEGIN SOLUTION
```python
result = df.iloc[List]
```
Wait, let me re-read the problem more carefully. [...]
Alternative approaches that would also work:
1. Using `np.nditer()`:
```python
...
That output style is where the bare-prompt cells lose their accuracy: the model often gives the right answer first and then helpfully appends alternatives or a self-correction, so a fixed block-picking rule sometimes grades a snippet that runs (valid) but is not the committed answer — deflating P(correct | valid) at identical validity. Z barely differs between the two modes (0.716 vs 0.700); ŝ is where they diverge (0.480 vs 0.294).
Each variant wraps the official problem before the chat template is applied (expert is the exception: raw completion with a header). Verbatim templates — {prompt} stands for the official DS-1000 problem:
You are completing Python data-science code. The following is a DS-1000 problem: the code after BEGIN SOLUTION must replace the missing part.
{prompt}
Output ONLY the missing completion code in a single ```python block. No explanation, no imports already present in the problem, no surrounding code — exactly what belongs at the BEGIN SOLUTION slot.Example problem:
Problem:
Given a pandas DataFrame df with a column 'x', add a column 'y' equal to twice 'x'.
A:
<code>
import pandas as pd
df = pd.DataFrame({'x': [1, 2]})
</code>
BEGIN SOLUTION
<code>
Example answer:
```python
df['y'] = 2 * df['x']
```
Now the real problem.
You are completing Python data-science code. The following is a DS-1000 problem: the code after BEGIN SOLUTION must replace the missing part.
{prompt}
Output ONLY the missing completion code in a single ```python block. No explanation, no imports already present in the problem, no surrounding code — exactly what belongs at the BEGIN SOLUTION slot.{prompt}
First state in at most two sentences what the completion must do, then give the final completion code in a single ```python block.# Expert data-science reference solution (correct, minimal, idiomatic)
# Passes all hidden tests.
{prompt}A screen over four prompt variants (150 stratified problems × 25 samples, FP8) selected a prompt with one worked format example plus an instruction to answer in a single fenced block. The example is synthetic (not a DS-1000 problem, so nothing evaluated leaks into the prompt) and trivial by design — it demonstrates the answer shape, not task knowledge:
Example problem:
Problem:
Given a pandas DataFrame df with a column 'x', add a column 'y' equal to twice 'x'.
A:
<code>
import pandas as pd
df = pd.DataFrame({'x': [1, 2]})
</code>
BEGIN SOLUTION
<code>
Example answer:
```python
df['y'] = 2 * df['x']
```
Now the real problem.
You are completing Python data-science code. The following is a DS-1000 problem: the code after BEGIN SOLUTION must replace the missing part.
<official DS-1000 problem>
Output ONLY the missing completion code in a single ```python block. No explanation, no imports already present in the problem, no surrounding code — exactly what belongs at the BEGIN SOLUTION slot.
Screen results (a plan-then-code variant hurts; the raw-completion 'expert header' variant ties but is not model-card serving):
| prompt variant | pass@1 | Z | pass@1 (non-MPL) |
|---|---|---|---|
| few-shot example + single-block instruction | 0.519 | 0.874 | 0.504 |
| raw completion + expert header | 0.520 | 0.871 | 0.491 |
| single-block instruction only | 0.518 | 0.863 | 0.489 |
| brief plan, then code | 0.389 | 0.826 | 0.336 |
| bare model-card prompt (reference) | 0.283 | 0.731 | — |
pass@1 more than doubles (0.209 → 0.490, 2.3×) and ŝ rises 0.305 → 0.516. Two mechanisms: (1) extraction — bare chat answers bury the solution among prose, self-corrections and alternative snippets, so any fixed fenced-block heuristic sometimes grades the wrong block (visible as correct>valid disagreements in the bare-prompt cells); the single-block instruction makes extraction unambiguous. (2) commitment — answers shrink to a median ~50 tokens and concentrate on the model's best guess.
The concentration trade-off. pass@100 does not improve (0.587 → 0.592, vs 0.725 under the diverse raw-completion protocol), and the number of problems with no valid sample in 100 grows (33 → 131 of 845): the engineered prompt raises the floor without extending coverage — it nearly pre-collapses the sample distribution onto one answer. Selection-by-validity (best-of-K, rejection sampling) therefore has far less headroom on a well-prompted model (ŝ − pass@1 ≈ +0.03) than on a bare one (≈ +0.10), and the two serving styles bracket the coverage–concentration spectrum the posterior-conditioning story lives on.
| library | Numpy | Pandas | Pytorch | Scipy | Sklearn | Tensorflow |
|---|---|---|---|---|---|---|
| ŝ · bare prompt | 0.267 | 0.266 | 0.521 | 0.299 | 0.356 | 0.288 |
| Z · bare prompt | 0.782 | 0.796 | 0.490 | 0.720 | 0.421 | 0.538 |
| ŝ · few-shot prompt | 0.605 | 0.459 | 0.605 | 0.619 | 0.517 | 0.077 |
| Z · few-shot prompt | 0.869 | 0.881 | 0.793 | 0.785 | 0.650 | 0.129 |
Generation: smc_learning/scripts/analysis/gen_ds1000_rollouts.py (sweep-identical official prompts; --chat card serving; --wrap fewshot); scoring: the canonical re-score pipeline (rescore_ds1000_cell.py --postprocess chat) in the DS-1000 environment.yml env.
ŝ and Z broken down by library for a single model. Use the selector to switch models; the two plots and the table below update together. Shaded bands are 95% bootstrap CIs (2000 resamples of that library’s problems).
ŝ (macro), zero-valid fraction, Z and pooled Ŝ by library and temperature (selected model):
| library | metric | t=0.0 | t=0.2 | t=0.4 | t=0.6 | t=0.7 | t=0.8 | t=1.0 |
|---|---|---|---|---|---|---|---|---|
| Numpy | ŝ (macro) | 0.364 | 0.403 | 0.380 | 0.351 | – | 0.312 | 0.273 |
| zero-valid frac. | 0.250 | 0.059 | 0.032 | 0.023 | – | 0.005 | 0.014 | |
| Z | 0.750 | 0.747 | 0.724 | 0.649 | – | 0.528 | 0.346 | |
| Ŝ (pooled) | 0.485 | 0.469 | 0.439 | 0.407 | – | 0.368 | 0.344 | |
| Pandas | ŝ (macro) | 0.210 | 0.235 | 0.239 | 0.210 | – | 0.171 | 0.127 |
| zero-valid frac. | 0.326 | 0.041 | 0.007 | 0.000 | – | 0.000 | 0.003 | |
| Z | 0.673 | 0.672 | 0.640 | 0.568 | – | 0.453 | 0.270 | |
| Ŝ (pooled) | 0.311 | 0.306 | 0.297 | 0.265 | – | 0.224 | 0.188 | |
| Pytorch | ŝ (macro) | 0.221 | 0.314 | 0.332 | 0.349 | – | 0.306 | 0.244 |
| zero-valid frac. | 0.412 | 0.118 | 0.088 | 0.000 | – | 0.000 | 0.000 | |
| Z | 0.588 | 0.614 | 0.583 | 0.518 | – | 0.412 | 0.227 | |
| Ŝ (pooled) | 0.375 | 0.385 | 0.407 | 0.408 | – | 0.366 | 0.329 | |
| Scipy | ŝ (macro) | 0.292 | 0.340 | 0.351 | 0.336 | – | 0.298 | 0.244 |
| zero-valid frac. | 0.406 | 0.123 | 0.047 | 0.019 | – | 0.028 | 0.028 | |
| Z | 0.594 | 0.572 | 0.554 | 0.488 | – | 0.375 | 0.214 | |
| Ŝ (pooled) | 0.492 | 0.475 | 0.452 | 0.414 | – | 0.379 | 0.354 | |
| Sklearn | ŝ (macro) | 0.252 | 0.449 | 0.456 | 0.417 | – | 0.332 | 0.275 |
| zero-valid frac. | 0.565 | 0.122 | 0.043 | 0.026 | – | 0.018 | 0.043 | |
| Z | 0.435 | 0.453 | 0.431 | 0.376 | – | 0.269 | 0.120 | |
| Ŝ (pooled) | 0.580 | 0.555 | 0.503 | 0.446 | – | 0.367 | 0.327 | |
| Tensorflow | ŝ (macro) | 0.444 | 0.542 | 0.517 | 0.424 | – | 0.348 | 0.303 |
| zero-valid frac. | 0.222 | 0.044 | 0.022 | 0.022 | – | 0.022 | 0.022 | |
| Z | 0.778 | 0.696 | 0.665 | 0.575 | – | 0.467 | 0.280 | |
| Ŝ (pooled) | 0.571 | 0.520 | 0.499 | 0.453 | – | 0.393 | 0.362 |