{"record":{"id":"0146119f675a7f6e","repo":"jax-ml/jax","slug":"prng-with-name-impl-name-already-registered-im","errorCode":null,"errorMessage":"PRNG with name {impl.name} already registered: {impl}","messagePattern":"PRNG with name (.+?) already registered: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/random/prng.py","lineNumber":120,"sourceCode":"  def __hash__(self) -> int:\n    return hash(self.tag)\n\n  def __str__(self) -> str:\n    return self.tag\n\n  def pprint(self):\n    ty = self.__class__.__name__\n    return (pp.text(f\"{ty} [{self.tag}] {{{self.name}}}:\") +\n            pp.nest(2, pp.group(pp.brk() + pp.join(pp.brk(), [\n              pp.text(f\"{k} = {v}\") for k, v in self._asdict().items()\n            ]))))\n\n\nprngs: dict[str, PRNGImpl] = {}\n\ndef register_prng(impl: PRNGImpl):\n  if impl.name in prngs:\n    raise ValueError(f'PRNG with name {impl.name} already registered: {impl}')\n  prngs[impl.name] = impl\n\n\n# -- PRNG key arrays\n\ndef _check_prng_key_data(impl, key_data: typing.Array):\n  ndim = len(impl.key_shape)\n  if not all(hasattr(key_data, attr) for attr in ['ndim', 'shape', 'dtype']):\n    raise TypeError(\"JAX encountered invalid PRNG key data: expected key_data \"\n                    f\"to have ndim, shape, and dtype attributes. Got {key_data}\")\n  if key_data.ndim < 1:\n    raise TypeError(\"JAX encountered invalid PRNG key data: expected \"\n                    f\"key_data.ndim >= 1; got ndim={key_data.ndim}\")\n  if key_data.shape[-ndim:] != impl.key_shape:\n    raise TypeError(\"JAX encountered invalid PRNG key data: expected key_data.shape to \"\n                    f\"end with {impl.key_shape}; got shape={key_data.shape} for {impl=}\")\n  if key_data.dtype not in [np.uint32, float0]:\n    raise TypeError(\"JAX encountered invalid PRNG key data: expected key_data.dtype = uint32; \"","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/random/prng.py#L102-L138","documentation":"JAX keeps a global registry prngs mapping implementation names to PRNGImpl objects. register_prng raises ValueError if an implementation with the same name is already registered, preventing silent replacement of built-in impls like 'threefry2x32' or 'philox4x32'.","triggerScenarios":"Calling jax._src.random.prng.register_prng with a custom PRNGImpl whose name collides with an existing one, or registering the same custom impl twice (e.g. module re-import or repeated notebook cell execution).","commonSituations":"Custom PRNG plugins in libraries that register on import; notebooks that re-run a registration cell; library version upgrades adding a name your custom impl also uses.","solutions":["Guard registration: if impl.name not in prngs: register_prng(impl)","Give the custom implementation a unique name","Reuse the already-registered impl instead of re-registering (fetch prngs[impl.name] and compare)"],"exampleFix":"# before\nregister_prng(my_impl)  # raises if re-imported\n# after\nfrom jax._src.random import prng\nif my_impl.name not in prng.prngs:\n    prng.register_prng(my_impl)","handlingStrategy":"type-guard","validationCode":"from jax._src.random import prng\nif my_impl.name not in prng.prngs:\n    prng.register_prng(my_impl)","typeGuard":"def is_new_prng_name(name) -> bool:\n    from jax._src.random import prng\n    return name not in prng.prngs","tryCatchPattern":"try:\n    register_prng(my_impl)\nexcept ValueError:\n    pass  # already registered; reuse existing","preventionTips":["Make registration idempotent in library __init__","Namespace custom impl names (e.g. 'mylib_xorwow')"],"tags":["jax","prng","registry","duplicate-registration"],"backgroundTag":"duplicate-name-registration","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}