{"record":{"id":"1773b864cd025ca4","repo":"jax-ml/jax","slug":"invalid-dimension-dim-for-tiling-self","errorCode":null,"errorMessage":"Invalid dimension {dim} for tiling {self}","messagePattern":"Invalid dimension (.+?) for tiling (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/experimental/mosaic/gpu/fragmented_array.py","lineNumber":169,"sourceCode":"      tiled_dims = shape[-len(canonical_tile):]\n      if tiled_dims == canonical_tile:\n        continue\n      shape = canonical_tile\n      new_tiling.append(canonical_tile)\n    return Tiling(tuple(new_tiling))\n\n  def tile_strides(self, strides: tuple[int, ...]) -> tuple[int, ...]:\n    \"\"\"Computes the strides of an array after tiling.\"\"\"\n    for tile in self.tiles:\n      untiled, tiled = strides[:-len(tile)], strides[-len(tile):]\n      strides = (*untiled, *(s * t for s, t in zip(tiled, tile)), *tiled)\n    return strides\n\n  def tile_dimension(self, dim: int) -> tuple[bool, ...]:\n    \"\"\"Result is True whenever the tiled dim originated from the given input dim.\"\"\"\n    tiling_rank = len(self.tiles[0])\n    if dim < 0 or dim >= tiling_rank:\n      raise ValueError(f\"Invalid dimension {dim} for tiling {self}\")\n    strides = [1] * tiling_rank\n    strides[dim] = 0\n    return tuple(s == 0 for s in self.tile_strides(tuple(strides)))\n\n  def remove_dimension(self, dim: int) -> Tiling:\n    \"\"\"Returns a tiling with the given dimension removed.\"\"\"\n    tiling_rank = len(self.tiles[0])\n    if dim < 0 or dim >= tiling_rank:\n      raise ValueError(f\"Invalid dimension {dim} for tiling {self}\")\n    dim_in_tile = dim\n    tiles = []\n    last_tile_rank = len(self.tiles[0])\n    for t in self.tiles:\n      assert last_tile_rank >= len(t)\n      dim_in_tile -= last_tile_rank - len(t)\n      last_tile_rank = len(t)\n      if dim_in_tile >= 0:\n        t = t[:dim_in_tile] + t[dim_in_tile + 1:]","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/experimental/mosaic/gpu/fragmented_array.py#L151-L187","documentation":"Tiling.tile_dimension(dim) requires 0 <= dim < rank of the outermost tile (len(self.tiles[0])); the dim indexes into the tiled (outermost) dims, so out-of-range dims are invalid.","triggerScenarios":"Calling tile_dimension(d) where d >= len(tiling.tiles[0]) or d < 0 — e.g. indexing a logical array dim that is not part of the outer tiling, or negative indexing which this API doesn't support.","commonSituations":"Reduction/broadcast lowering code computing dims from a different layout's rank; after removing dims the caller reuses stale dim indices.","solutions":["Clamp/validate dim against len(tiling.tiles[0]) before calling","Recompute dim indices after layout transformations like remove_dimension","Use non-negative indices only"],"exampleFix":"// before\nmask = tiling.tile_dimension(dim)\n// after\nassert 0 <= dim < len(tiling.tiles[0]), 'dim not in outer tile'\nmask = tiling.tile_dimension(dim)","handlingStrategy":"type-guard","validationCode":"assert 0 <= dim < len(tiling.tiles[0])","typeGuard":"def valid_tiled_dim(tiling, dim) -> bool:\n    return 0 <= dim < len(tiling.tiles[0])","tryCatchPattern":null,"preventionTips":["Never use negative dims with tile_dimension","Recompute dim indices after layout transformations"],"tags":["mosaic","fragmented-array","tiling","index-out-of-range"],"backgroundTag":"index-out-of-range","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}