{"record":{"id":"721ccfefc692d93a","repo":"jax-ml/jax","slug":"unreduced-kind-should-be-none-when-unreduced","errorCode":null,"errorMessage":"`unreduced_kind` should be `None` when `unreduced` is an empty set. Got {unreduced_kind=} and {unreduced=}","messagePattern":"`unreduced_kind` should be `None` when `unreduced` is an empty set\\. Got (.+?) and (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/core.py","lineNumber":2359,"sourceCode":"\n\ndef _check_mat(varying, unreduced, reduced, unreduced_kind):\n  if varying & unreduced:\n    raise ValueError(\n        \"varying and unreduced cannot have common mesh axes. Got\"\n        f\" varying={varying} and unreduced={unreduced}\")\n  if varying & reduced:\n    raise ValueError(\n        \"varying and reduced cannot have common mesh axes. Got\"\n        f\" varying={varying} and reduced={reduced}\")\n  assert not (varying & unreduced & reduced)\n\n  if unreduced_kind is not None and not isinstance(unreduced_kind, UnreducedKind):\n    raise TypeError(\n        \"Expected unreduced_kind to be of type `jax.sharding.UnreducedKind`\"\n        f\" but got {type(unreduced_kind)}\")\n  if not unreduced and unreduced_kind is not None:\n    raise ValueError(\n        \"`unreduced_kind` should be `None` when `unreduced` is an empty set.\"\n        f\" Got {unreduced_kind=} and {unreduced=}\")\n\ndef _canonicalize_mat(name, val):\n  if not isinstance(val, frozenset):\n    if not isinstance(val, set):\n      raise TypeError(\n          f\"{name} argument of ManualAxisType should \"\n          f\"of type `frozenset` or `set`. Got type {type(val)}\")\n    val = frozenset(val)\n  return val\n\n\n@immutable\nclass ManualAxisType:\n  __slots__ = ('varying', 'unreduced', 'reduced', 'unreduced_kind',\n               '__weakref__')\n","sourceCodeStart":2341,"sourceCodeEnd":2377,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/core.py#L2341-L2377","documentation":"ManualAxisType validation: unreduced_kind only makes sense when there is at least one unreduced axis. If the unreduced set is empty, unreduced_kind must be None.","triggerScenarios":"ManualAxisType(unreduced=frozenset(), unreduced_kind=UnreducedKind.sum), or code that unconditionally passes a kind even when the unreduced set empties out.","commonSituations":"Generic code paths that always set unreduced_kind regardless of the sets; refactors that removed axes from 'unreduced' but kept the kind field.","solutions":["Set unreduced_kind=None whenever unreduced is empty","Guard: kind if unreduced else None","Use the default constructor (kind defaults to None) unless needed"],"exampleFix":"// before\nmat = ManualAxisType(unreduced=frozenset(), unreduced_kind=UnreducedKind.sum)\n\n// after\nmat = ManualAxisType(unreduced_kind=UnreducedKind.sum if unreduced else None)","handlingStrategy":"validation","validationCode":"if not unreduced and unreduced_kind is not None:\n    unreduced_kind = None","typeGuard":"def consistent(unreduced, kind): return (not unreduced and kind is None) or (bool(unreduced) and (kind is None or isinstance(kind, UnreducedKind)))","tryCatchPattern":null,"preventionTips":["Default to None and set kind only when unreduced is non-empty"],"tags":["jax","sharding","unreduced-kind","validation"],"backgroundTag":"invalid-enum-argument","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}