{"record":{"id":"5dbaa084fa8debb3","repo":"jax-ml/jax","slug":"left-eigenvectors-are-not-supported-by-cusolver","errorCode":null,"errorMessage":"Left eigenvectors are not supported by cusolver","messagePattern":"Left eigenvectors are not supported by cusolver","errorType":"validation","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"jax/_src/lax/linalg.py","lineNumber":1115,"sourceCode":"  else:\n    raise ValueError(f\"Unsupported dtype: {dtype}\")\n\n  have_cusolver_geev = (\n      target_name_prefix == \"cu\"\n      and cuda_versions\n      and cuda_versions.cusolver_get_version() >= 11701\n  )\n\n  if (\n      implementation is None and have_cusolver_geev\n      and not compute_left_eigenvectors\n  ) or implementation == EigImplementation.CUSOLVER:\n    if not have_cusolver_geev:\n      raise RuntimeError(\n          \"Nonsymmetric eigendecomposition requires cusolver 11.7.1 or newer\"\n      )\n    if compute_left_eigenvectors:\n      raise NotImplementedError(\n          \"Left eigenvectors are not supported by cusolver\")\n    target_name = f\"{target_name_prefix}solver_geev_ffi\"\n    avals_out = [\n        ShapedArray(batch_dims + (n, n), dtype),\n        ShapedArray(batch_dims + (n,), complex_dtype),\n        ShapedArray(batch_dims + (n, n), dtype),\n        ShapedArray(batch_dims + (n, n), dtype),\n        ShapedArray(batch_dims, np.int32),\n    ]\n\n    rule = _linalg_ffi_lowering(target_name, avals_out=avals_out)\n    _, w, vl, vr, info = rule(ctx, operand, left=compute_left_eigenvectors,\n                              right=compute_right_eigenvectors)\n    if is_real:\n      unpack = mlir.lower_fun(_unpack_conjugate_pairs, multiple_results=False)\n      if compute_left_eigenvectors:\n        sub_ctx = ctx.replace(\n            primitive=None,","sourceCodeStart":1097,"sourceCodeEnd":1133,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/lax/linalg.py#L1097-L1133","documentation":"jax/_src/lax/linalg.py:1115 in _eig_gpu_lowering. The cusolver geev FFI path used by jax.lax.linalg.eig on GPU only computes right eigenvectors. If compute_left_eigenvectors=True is requested together with the cusolver implementation (explicitly or via auto-selection), JAX raises NotImplementedError because the underlying kernel has no left-eigenvector API.","triggerScenarios":"Calling jax.lax.linalg.eig(a, compute_left_eigenvectors=True, implementation=EigImplementation.CUSOLVER) on GPU; or compute_left_eigenvectors=True with implementation=None on a new cusolver when the auto path would pick cusolver.","commonSituations":"Porting scipy.linalg.eig(..., left=True, right=True) code to JAX; algorithm research code that wants both eigenvector sets on GPU.","solutions":["Request only right eigenvectors: compute_left_eigenvectors=False (the default)","Derive left eigenvectors from right ones: for diagonalizable A, left vectors of A are right eigenvectors of A.T (rows of inv(V)); compute via eig(A.T) or Vinv = jnp.linalg.inv(v)","Run that piece on CPU where a LAPACK path supports both, via jax.device_put + backend selection"],"exampleFix":"// before\nwl, vl, vr = jax.lax.linalg.eig(a, compute_left_eigenvectors=True)\n// after\nw, vr = jax.lax.linalg.eig(a)  # left vectors: eig of transpose\nwt, vl_t = jax.lax.linalg.eig(a.T)\nvl = vl_t.T.conj()","handlingStrategy":"fallback","validationCode":"want_left = False  # never request left eigenvectors on cusolver path\nif want_left:\n    plan = 'compute eig of A.T instead'","typeGuard":null,"tryCatchPattern":"try:\n    wl, vl, vr = jax.lax.linalg.eig(a, compute_left_eigenvectors=True)\nexcept NotImplementedError:\n    wt, vlt = jax.lax.linalg.eig(a.T)\n    wl, vl = wt, vlt.T.conj()","preventionTips":["Remember cusolver geev has no left-vector API","Derive left vectors from the transpose decomposition"],"tags":["jax","eig","cusolver","gpu","not-implemented"],"backgroundTag":"unsupported-operation-on-backend","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}