{"record":{"id":"608ce37b620f606d","repo":"jax-ml/jax","slug":"name-argument-of-manualaxistype-should-of-type","errorCode":null,"errorMessage":"{name} argument of ManualAxisType should of type `frozenset` or `set`. Got type {type(val)}","messagePattern":"(.+?) argument of ManualAxisType should of type `frozenset` or `set`\\. Got type (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"jax/_src/core.py","lineNumber":2366,"sourceCode":"  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\n  varying: frozenset\n  unreduced: frozenset\n  reduced: frozenset\n  unreduced_kind: UnreducedKind | None\n\n  @staticmethod\n  @weak_value_interner","sourceCodeStart":2348,"sourceCodeEnd":2384,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/core.py#L2348-L2384","documentation":"_canonicalize_mat accepts only frozenset or set for ManualAxisType's varying/unreduced/reduced arguments. Passing a list, tuple, string, or other iterable raises TypeError.","triggerScenarios":"ManualAxisType(varying=['x','y']) or varying=('x',) — lists/tuples are rejected rather than coerced.","commonSituations":"Naturally writing a list literal for the axis names; copy-pasting from reprs that show different containers; older code assuming lenient coercion.","solutions":["Wrap in set()/frozenset(): ManualAxisType(varying={'x','y'})","Validate inputs before constructing if they come from user config","Update any tuple-producing callers to convert"],"exampleFix":"// before\nmat = ManualAxisType(varying=['x', 'y'])\n\n// after\nmat = ManualAxisType(varying={'x', 'y'})","handlingStrategy":"type-guard","validationCode":"varying = frozenset(varying) if not isinstance(varying, frozenset) else varying\n# note: only set/frozenset accepted; convert lists first","typeGuard":"def is_ok_axis_container(v): return isinstance(v, (set, frozenset))","tryCatchPattern":null,"preventionTips":["Always use set literals {'x'} for mat arguments","Convert external config data to sets before constructing ManualAxisType"],"tags":["jax","sharding","type-error","constructor-validation"],"backgroundTag":"wrong-argument-type","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}