verifiers 0.2.2.dev82__py3-none-any.whl → 0.2.2.dev84__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
verifiers/v1/graph.py CHANGED
@@ -101,6 +101,11 @@ class MessageNode(BaseModel):
101
101
  logprobs: list[float] = Field(default_factory=list)
102
102
  """Sampling logprobs for the sampled tokens — length equals the number of True entries in
103
103
  `mask`; empty for input messages."""
104
+ advantages: list[float] | None = None
105
+ """Per-token credit over the sampled tokens, same layout as `logprobs`. `None` until a
106
+ consumer's RL algorithm assigns it, which is not the same as a credit of zero: a group whose
107
+ rewards were all equal is assigned zeros and carries no gradient, while an unassigned node was
108
+ never scored at all."""
104
109
  multi_modal_data: SkipJsonSchema[MultiModalData | None] = None
105
110
  """The renderer items for the images this message's content introduces (pixel tensors,
106
111
  grids, hashes, placeholders) — the only carrier of the pixels from the env server to the
verifiers/v1/trace.py CHANGED
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import time
4
4
  import traceback
5
5
  import uuid
6
- from collections.abc import Mapping
6
+ from collections.abc import Callable, Mapping
7
7
  from typing import TYPE_CHECKING, Annotated, Any, Generic, Literal
8
8
 
9
9
  import numpy as np
@@ -200,28 +200,45 @@ class Branch(BaseModel):
200
200
  mask.extend(node.mask)
201
201
  return mask
202
202
 
203
- @property
204
- def logprobs(self) -> list[float]:
205
- """Per-token sampling logprobs aligned to `token_ids` — the node logprobs spread onto
206
- their sampled positions, 0.0 on every non-sampled token."""
203
+ def spread(
204
+ self, values: Callable[[MessageNode], list[float] | None]
205
+ ) -> list[float]:
206
+ """A per-sampled-token node field widened to `token_ids`: each node's values land on its
207
+ sampled positions, 0.0 everywhere else. A node holding nothing contributes zeros."""
207
208
  out: list[float] = []
208
209
  for node in self.nodes:
209
- mask = node.mask
210
- sampled = sum(mask) if node.logprobs else 0
210
+ mask, node_values = node.mask, values(node) or []
211
+ sampled = sum(mask) if node_values else 0
211
212
  # Bulk-fill the canonical unsampled-prefix/sampled-suffix layout.
212
213
  if not sampled or all(mask[-sampled:]):
213
- out += [0.0] * (len(mask) - sampled) + node.logprobs[:sampled]
214
- out += [0.0] * max(0, sampled - len(node.logprobs))
214
+ out += [0.0] * (len(mask) - sampled) + node_values[:sampled]
215
+ out += [0.0] * max(0, sampled - len(node_values))
215
216
  continue
216
217
  li = 0
217
- for sampled in mask:
218
- if sampled:
219
- out.append(node.logprobs[li] if li < len(node.logprobs) else 0.0)
218
+ for is_sampled in mask:
219
+ if is_sampled:
220
+ out.append(node_values[li] if li < len(node_values) else 0.0)
220
221
  li += 1
221
222
  else:
222
223
  out.append(0.0)
223
224
  return out
224
225
 
226
+ @property
227
+ def logprobs(self) -> list[float]:
228
+ """Per-token sampling logprobs aligned to `token_ids` — the node logprobs spread onto
229
+ their sampled positions, 0.0 on every non-sampled token."""
230
+ return self.spread(lambda node: node.logprobs)
231
+
232
+ @property
233
+ def advantages(self) -> list[float] | None:
234
+ """Per-token credit aligned to `token_ids`, spread like `logprobs` — or `None` when no node
235
+ on the path was ever assigned any, which a branch of zeros would otherwise be
236
+ indistinguishable from. A partially assigned path spreads, the unassigned nodes reading
237
+ 0.0."""
238
+ if all(node.advantages is None for node in self.nodes):
239
+ return None
240
+ return self.spread(lambda node: node.advantages)
241
+
225
242
  @property
226
243
  def multi_modal_data(self) -> MultiModalData | None:
227
244
  """Node image data concatenated in token order for training; never persisted."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev82
3
+ Version: 0.2.2.dev84
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -172,7 +172,7 @@ verifiers/v1/agent.py,sha256=MQVKGjUhrP8uzRXAq94uJHkEsdHFziPxQHZ7TOD324I,31306
172
172
  verifiers/v1/env.py,sha256=g6fpoG-Z9lM3vTKrrU-QRJY3S88_y9zsPHwBvfs5vdY,17865
173
173
  verifiers/v1/episode.py,sha256=8G5OaGOku9S_gavQdpfUZgRZfrf1zmpjFrBL-TsppIk,4123
174
174
  verifiers/v1/errors.py,sha256=kQeEPX06TwAIuiz7MlWFYirrpKbx5STi6A5b_dtQQoA,6885
175
- verifiers/v1/graph.py,sha256=aBAzh1Ibp3klKNYjvzNyJSbjV8Oi5TJ791dN7o6ex1E,29070
175
+ verifiers/v1/graph.py,sha256=psE4gww42TuSy_B4rJfGauycGTzPes6Z2SKFAzPYg7M,29427
176
176
  verifiers/v1/harness.py,sha256=eKuqvYbQjnCMavkiYWZQDHJgH08m6SJ4PuevPuShjS0,11097
177
177
  verifiers/v1/judge.py,sha256=Pvr0C41ah1qkNSZ0WXdkDvBMfv5YSfY1REHncwlJ8cg,9346
178
178
  verifiers/v1/legacy.py,sha256=YvcWF6d8xvkeqUPM36oif0ZrjmB0mj7nNrfwha0Nr2w,22850
@@ -181,7 +181,7 @@ verifiers/v1/session.py,sha256=p8vz89DJUmb9r8dkq80zn2WBEqo8Vwh8ot1ZXm_WVAM,7210
181
181
  verifiers/v1/state.py,sha256=EckF2bWp-vV4b1jYJ9sLI5xrfGuI5spIgYYwW926toI,595
182
182
  verifiers/v1/task.py,sha256=jwMKiKlMtksTd8j2dcDlFtb6LC8BRE-N5jkNXlMp2jc,9457
183
183
  verifiers/v1/taskset.py,sha256=fp2E0IEhL_Ybj9cegZwljfTmW27p_30zTWHFKw_kXE4,4374
184
- verifiers/v1/trace.py,sha256=esJE1aT9jRCbBad-BVR9xjX5Emk4mHdYmC7Zct-3zK8,19129
184
+ verifiers/v1/trace.py,sha256=Mjc9NaqmUVKXhn6RKaTaGVxPRldCGqgHxb74cqtp5_k,20026
185
185
  verifiers/v1/types.py,sha256=1PxamJspmoTc3OlFZAwH6o_2i_Tg9ZNvHxttIHWIxq8,8948
186
186
  verifiers/v1/acp/__init__.py,sha256=9SYCFtzGUM_wH98ldpVLcFhoq2M999jbG0tU5ODY70U,2297
187
187
  verifiers/v1/acp/_runner.py,sha256=BcYaNZHuawzCgxOVdhiF6PY_B1HMxIA1MwHy0mOzhSk,7740
@@ -337,8 +337,8 @@ verifiers/v1/utils/platform.py,sha256=56Ixmk1SER6q5LvzyYcA0hgzGpzhxKZL8Hiqp4c_XV
337
337
  verifiers/v1/utils/retries.py,sha256=Y2ZgrAjn-qNkRKZP_RVNL_7EK0iaRcZeCa404lpGYi4,5417
338
338
  verifiers/v1/utils/score.py,sha256=-R5Cog14r_tJ6Q_oOfGr5VPAm2CCUhofYZB6B9lm4wM,5787
339
339
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
340
- verifiers-0.2.2.dev82.dist-info/METADATA,sha256=hwKzS7edm6kC2DKpuNCPpith5Nc6wcowpC3UCtG6eqc,4545
341
- verifiers-0.2.2.dev82.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
342
- verifiers-0.2.2.dev82.dist-info/entry_points.txt,sha256=v6v0QT9vVExnfn4br42MostI_o3f3ZbWYlTormz-U3g,515
343
- verifiers-0.2.2.dev82.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
344
- verifiers-0.2.2.dev82.dist-info/RECORD,,
340
+ verifiers-0.2.2.dev84.dist-info/METADATA,sha256=hu_D0aS0L0VjJxeOvodUkjLmh1Ag4g4VU7iMaD8Yo2g,4545
341
+ verifiers-0.2.2.dev84.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
342
+ verifiers-0.2.2.dev84.dist-info/entry_points.txt,sha256=v6v0QT9vVExnfn4br42MostI_o3f3ZbWYlTormz-U3g,515
343
+ verifiers-0.2.2.dev84.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
344
+ verifiers-0.2.2.dev84.dist-info/RECORD,,