{"record":{"id":"96445bfc0230bf8b","repo":"jax-ml/jax","slug":"invalid-argument-side-side-r-expected-left-or","errorCode":null,"errorMessage":"invalid argument side={side!r}, expected 'left' or 'right'","messagePattern":"invalid argument side=(.+?), expected 'left' or 'right'","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/numpy/hijax.py","lineNumber":84,"sourceCode":"      out_dtype: np.dtype):\n    batch_dims = operator.index(batch_dims)\n    if batch_dims < 0 or batch_dims >= sorted_arr_aval.ndim:\n      raise ValueError(\n          f\"batch_dims={batch_dims} must be in range [0, {sorted_arr_aval.ndim})\"\n      )\n    dimension = operator.index(dimension)\n    if not batch_dims <= dimension < sorted_arr_aval.ndim:\n      raise ValueError(\n          f\"dimension={dimension} must be in range [{batch_dims},\"\n          f\" {sorted_arr_aval.ndim})\"\n      )\n    if sorted_arr_aval.dtype != query_aval.dtype:\n      raise ValueError(\n          \"dtypes of sorted_arr and query must match; got \"\n          f\"{sorted_arr_aval.dtype} and {query_aval.dtype}\"\n      )\n    if side not in [\"left\", \"right\"]:\n      raise ValueError(\n          f\"invalid argument side={side!r}, expected 'left' or 'right'\"\n      )\n    if method not in self.valid_methods:\n      raise ValueError(\n          f\"invalid argument {method=}, expected one of {list(self.valid_methods)}\"\n      )\n    if sorted_arr_aval.shape[:batch_dims] != query_aval.shape[:batch_dims]:\n      raise ValueError(\n          \"batch dimension sizes must match; got\"\n          f\" {sorted_arr_aval.shape[:batch_dims]} != {query_aval.shape[:batch_dims]}\"\n      )\n    if not dtypes.issubdtype(out_dtype, np.integer):\n      raise ValueError(f\"out_dtype should be an integer type; got {out_dtype}\")\n    # Attempt this here to catch overflow errors early.\n    out_dtype.type(sorted_arr_aval.shape[dimension])\n    self.in_avals = (sorted_arr_aval, query_aval)\n    self.out_aval = core.typeof(api.eval_shape(\n      functools.partial(_searchsorted_impl,","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/numpy/hijax.py#L66-L102","documentation":"Raised by the SearchSorted HiJAX primitive when the side argument is not exactly the string 'left' or 'right'. side controls whether ties return the first (left) or last (right) insertion index, mirroring numpy.searchsorted. Any other value, including capitalized or misspelled variants, is rejected at primitive construction.","triggerScenarios":"Passing side='Left', side='RIGHT', side=0/1, or a typo like side='rigth' to jax.numpy searchsorted.","commonSituations":"Porting code from an API that used booleans or integers for side; building side dynamically from user config with non-normalized casing.","solutions":["Use exactly side='left' or side='right'","If side comes from user input, normalize it: side.strip().lower()","Never pass an int/bool for side in this API"],"exampleFix":"# before\nidx = jnp.searchsorted(a, v, side='Left')\n# after\nidx = jnp.searchsorted(a, v, side='left')","handlingStrategy":"validation","validationCode":"assert side in ('left', 'right'), side","typeGuard":"def valid_side(s: str) -> bool:\n    return isinstance(s, str) and s in ('left', 'right')","tryCatchPattern":null,"preventionTips":["Treat side as a closed enum; validate config values before passing","Normalize user-supplied side with .strip().lower()"],"tags":["jax","searchsorted","argument-validation"],"backgroundTag":"invalid-enum-argument","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}