{"record":{"id":"2ab964b05d2a54f6","repo":"jax-ml/jax","slug":"bw-method-should-be-scott-silverman-a-scal","errorCode":null,"errorMessage":"`bw_method` should be 'scott', 'silverman', a scalar, or a callable.","messagePattern":"`bw_method` should be 'scott', 'silverman', a scalar, or a callable\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/_src/scipy/stats/kde.py","lineNumber":90,"sourceCode":"    else:\n      dataset, = promote_dtypes_inexact(dataset)\n      weights = jnp.full(n, 1.0 / n, dtype=dataset.dtype)\n\n    self._setattr(\"dataset\", dataset)\n    self._setattr(\"weights\", weights)\n    neff = self._setattr(\"neff\", 1 / jnp.sum(weights**2))\n\n    bw_method = \"scott\" if bw_method is None else bw_method\n    if bw_method == \"scott\":\n      factor = jnp.power(neff, -1. / (d + 4))\n    elif bw_method == \"silverman\":\n      factor = jnp.power(neff * (d + 2) / 4.0, -1. / (d + 4))\n    elif jnp.isscalar(bw_method) and not isinstance(bw_method, str):\n      factor = cast(Array, bw_method)\n    elif callable(bw_method):\n      factor = bw_method(self)\n    else:\n      raise ValueError(\n          \"`bw_method` should be 'scott', 'silverman', a scalar, or a callable.\"\n      )\n\n    data_covariance = jnp.atleast_2d(\n        jnp.cov(dataset, rowvar=True, bias=False, aweights=weights))\n    data_inv_cov = jnp.linalg.inv(data_covariance)\n    covariance = data_covariance * factor**2\n    inv_cov = data_inv_cov / factor**2\n    self._setattr(\"covariance\", covariance)\n    self._setattr(\"inv_cov\", inv_cov)\n\n  def _setattr(self, name, value):\n    # Frozen dataclasses don't support setting attributes so we have to\n    # overload that operation here as they do in the dataclass implementation\n    object.__setattr__(self, name, value)\n    return value\n\n  def tree_flatten(self):","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/_src/scipy/stats/kde.py#L72-L108","documentation":"The bw_method argument of gaussian_kde must be the string 'scott' or 'silverman', a non-string scalar, or a callable taking the KDE object. Anything else — including string typos or None passed positionally where a factor is expected — raises this ValueError at construction time.","triggerScenarios":"gaussian_kde(data, bw_method='Scott') (wrong case), bw_method='hansen', or passing a string that is neither 'scott' nor 'silverman'.","commonSituations":"Porting scipy code with a custom bandwidth name scipy accepts; case-sensitivity mistakes; passing a string-form number like '0.5' instead of the float 0.5.","solutions":["Use exactly 'scott', 'silverman', a numeric scalar (e.g. 0.5), or a callable like lambda kde: kde.n ** -0.2","Fix case and spelling of the string","If bandwidth came from config as a string number, convert to float before passing"],"exampleFix":"// before\nkde = gaussian_kde(data, bw_method='0.5')\n// after\nkde = gaussian_kde(data, bw_method=0.5)","handlingStrategy":"validation","validationCode":"import jnp\nvalid = bw in ('scott', 'silverman') or (callable(bw)) or (not isinstance(bw, str) and jnp.isscalar(bw))\nassert valid","typeGuard":"def bw_method_valid(bw) -> bool:\n    return bw in ('scott', 'silverman') or callable(bw) or (not isinstance(bw, str) and not hasattr(bw, '__len__'))","tryCatchPattern":null,"preventionTips":["Use lowercase 'scott'/'silverman' exactly","Convert config strings holding numbers to float before passing","Prefer callables for custom bandwidth rules"],"tags":["jax","scipy","kde","bandwidth","argument-validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}