{"record":{"id":"98c508b026b4046c","repo":"jax-ml/jax","slug":"unsupported-qr-decomposition-mode-mode-98c508","errorCode":null,"errorMessage":"Unsupported QR decomposition mode '{mode}'","messagePattern":"Unsupported QR decomposition mode '(.+?)'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/scipy/linalg.py","lineNumber":909,"sourceCode":"\n@overload\ndef _qr(a: ArrayLike, mode: str, pivoting: Literal[True]\n       ) -> tuple[Array, Array] | tuple[Array, Array, Array]: ...\n\n@overload\ndef _qr(a: ArrayLike, mode: str, pivoting: bool\n       ) -> tuple[Array] | tuple[Array, Array] | tuple[Array, Array, Array]: ...\n\n\n@jit(static_argnames=('mode', 'pivoting'))\ndef _qr(a: ArrayLike, mode: str, pivoting: bool\n       ) -> tuple[Array] | tuple[Array, Array] | tuple[Array, Array, Array]:\n  if mode in (\"full\", \"r\"):\n    full_matrices = True\n  elif mode == \"economic\":\n    full_matrices = False\n  else:\n    raise ValueError(f\"Unsupported QR decomposition mode '{mode}'\")\n  a, = promote_dtypes_inexact(jnp.asarray(a))\n  q, r, *p = lax_linalg.qr(a, pivoting=pivoting, full_matrices=full_matrices)\n  if mode == \"r\":\n    if pivoting:\n      return r, p[0]\n    return (r,)\n  if pivoting:\n    return q, r, p[0]\n  return q, r\n\n\n@overload\ndef qr(a: ArrayLike,  overwrite_a: bool = False, lwork: Any = None, *,\n       mode: Literal[\"full\", \"economic\"], pivoting: Literal[False] = False,\n       check_finite: bool = True) -> tuple[Array, Array]: ...\n\n@overload\ndef qr(a: ArrayLike,  overwrite_a: bool = False, lwork: Any = None, *,","sourceCodeStart":891,"sourceCodeEnd":927,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/scipy/linalg.py#L891-L927","documentation":"jax.scipy.linalg.qr only supports modes 'full', 'r', and 'economic'. SciPy's qr additionally supports 'complete' and (with pivoting) raw mode, which JAX has not implemented, so those mode strings raise ValueError.","triggerScenarios":"Calling jax.scipy.linalg.qr(a, mode='complete') or mode='raw'.","commonSituations":"Directly porting scipy.linalg.qr calls that use mode='complete' to get a full Q of shape (M, M) when M > N.","solutions":["Use mode='full' which in JAX returns full-sized Q (equivalent to SciPy's 'complete')","Use mode='economic' for reduced Q and R","Fall back to jnp.linalg.qr or host-side scipy.linalg.qr for exotic modes"],"exampleFix":"// before\nq, r = jax.scipy.linalg.qr(a, mode='complete')\n// after\nq, r = jax.scipy.linalg.qr(a, mode='full')","handlingStrategy":"type-guard","validationCode":"null","typeGuard":"_QR_MODES = {'full', 'r', 'economic'}\ndef jax_qr_mode_ok(mode): return mode in _QR_MODES","tryCatchPattern":null,"preventionTips":["Map SciPy mode names to JAX ones ('complete' -> 'full') in a port shim","Check jax.scipy docs for supported subsets before porting"],"tags":["jax","linalg","qr-decomposition","argument-validation"],"backgroundTag":"unsupported-parameter-value","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}