percygautam: I have considered the multimodal case and modified hpd tests. I can't seem to find how to use this modified hpd in `summary` function.
percygautam: I have made the changes. It is working fine for ndarray and datasets. Currently, I am first converting ndarray to dataset then using `wrap_xarray_ufunc`. 
I tried using directly on ndarray but the hpd is calculated is always calculated on the last dimension. Converting it to ndarray gives me control over which dimension to calculate hpd for.
Any workaround for this?
percygautam: Do we start the work of multimodal here or wait for everyone's opinion? Maybe create a new issue for multimodal discussion.
codecov[bot]: # [Codecov](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=h1) Report
> Merging [#1117](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=desc) into [master](https://codecov.io/gh/arviz-devs/arviz/commit/b1ccd0d91d5df3e941dc9d09f4f240affcf3bc05&el=desc) will **increase** coverage by `0.00%`.
> The diff coverage is `90.76%`.

[![Impacted file tree graph](https://codecov.io/gh/arviz-devs/arviz/pull/1117/graphs/tree.svg?width=650&height=150&src=pr&token=KZTdQCEf7t)](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master    #1117   +/-   ##
=======================================
  Coverage   92.68%   92.69%           
=======================================
  Files          93       93           
  Lines        9032     9085   +53     
=======================================
+ Hits         8371     8421   +50     
- Misses        661      664    +3     
```


| [Impacted Files](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [arviz/stats/stats.py](https://codecov.io/gh/arviz-devs/arviz/pull/1117/diff?src=pr&el=tree#diff-YXJ2aXovc3RhdHMvc3RhdHMucHk=) | `96.63% <90.76%> (+0.09%)` | :arrow_up: |
| [arviz/data/io\_pyro.py](https://codecov.io/gh/arviz-devs/arviz/pull/1117/diff?src=pr&el=tree#diff-YXJ2aXovZGF0YS9pb19weXJvLnB5) | `95.86% <0.00%> (-1.37%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=footer). Last update [b1ccd0d...0ff7d18](https://codecov.io/gh/arviz-devs/arviz/pull/1117?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

OriolAbril: I would work on multimodal in this same PR, otherwise, behaviour of ArviZ development version between merging this and the other will be quite confusing. 
percygautam: > Regarding multimodal case, I was thinking of a possible workaround, let's see what everyone thinks about this. The idea would be to have _hpd_multimodal return a result with shape (2, 10) (the 10 is completely arbitrary and could be modified, even be an argument). Of these 10 pairs of values, the first would be hpd intervals and the last ones will probably not be needed, and would be then set to nan (in _hpd_multimodal). Eventually hpd in the case of multimodal would drop nan values and return the hpd dataset with the proper shape (also, different variables may have different number of modes and this approach should solve this too).

Should I start implementing this or wait?
OriolAbril: Let's go ahead with multimodal :muscle: 
percygautam: I have tried to implement the multimodal case for a single input. Currently, I am filling only the first dimension with NaNs. 
How do we decide the size (10) of the first dimension in this case?
percygautam: I think ndarray input with ndims > 2 is not supported. 
OriolAbril: You can add a comment to ignore the pylint warning, it probably misses the pop
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b2bf074..babee92 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,14 +8,16 @@
 * Add `num_chains` and `pred_dims` arguments to io_pyro #1090
 * Integrate jointplot into pairplot, add point-estimate and overlay of plot kinds (#1079)
 * Allow xarray.Dataarray input for plots.(#1120)
+* Revamped the `hpd` function to make it work with mutidimensional arrays, InferenceData and xarray objects (#1117)
 * Skip test for optional/extra dependencies when not installed (#1113)
 ### Maintenance and fixes
 * Fixed behaviour of `credible_interval=None` in `plot_posterior` (#1115)
 * Fixed hist kind of `plot_dist` with multidimensional input (#1115)
-* Fixed `TypeError` in `transform` argument of `plot_density` and `plot_forest` when `InferenceData is a list or tuple (#1121)`
+* Fixed `TypeError` in `transform` argument of `plot_density` and `plot_forest` when `InferenceData` is a list or tuple (#1121)
 ### Deprecation
 
 ### Documentation
+* Add classifier to `setup.py` including Matplotlib framework (#1133)
 * Image thumbs generation updated to be Bokeh 2 compatible (#1116)
 * Add new examples for `plot_pair` (#1110)
 
diff --git a/README.md b/README.md
index 2da9f3f..dce282c 100644
--- a/README.md
+++ b/README.md
@@ -155,7 +155,7 @@ python setup.py install
 
 ## Dependencies
 
-ArviZ is tested on Python 3.5, 3.6 and 3.7, and depends on NumPy, SciPy, xarray, and Matplotlib.
+ArviZ is tested on Python 3.6, 3.7 and 3.8, and depends on NumPy, SciPy, xarray, and Matplotlib.
 
 
 ## Citation
diff --git a/arviz/stats/stats.py b/arviz/stats/stats.py
index d29fff7..cec2e3f 100644
--- a/arviz/stats/stats.py
+++ b/arviz/stats/stats.py
@@ -12,7 +12,7 @@ import scipy.stats as st
 from scipy.optimize import minimize
 import xarray as xr
 
-from ..plots.plot_utils import _fast_kde, get_bins
+from ..plots.plot_utils import _fast_kde, get_bins, get_coords
 from ..data import convert_to_inference_data, convert_to_dataset, InferenceData, CoordSpec, DimSpec
 from .diagnostics import _multichain_statistics, _mc_error, ess
 from .stats_utils import (
@@ -305,7 +305,18 @@ def _ic_matrix(ics, ic_i):
     return rows, cols, ic_i_val
 
 
-def hpd(ary, credible_interval=None, circular=False, multimodal=False, skipna=False):
+def hpd(
+    ary,
+    credible_interval=None,
+    circular=False,
+    multimodal=False,
+    skipna=False,
+    group="posterior",
+    var_names=None,
+    coords=None,
+    max_modes=10,
+    **kwargs
+):
     """
     Calculate highest posterior density (HPD) of array for given credible_interval.
 
@@ -313,8 +324,10 @@ def hpd(ary, credible_interval=None, circular=False, multimodal=False, skipna=Fa
 
     Parameters
     ----------
-    ary : Numpy array
-        An array containing posterior samples
+    ary : obj
+        object containing posterior samples.
+        Any object that can be converted to an az.InferenceData object.
+        Refer to documentation of az.convert_to_dataset for details.
     credible_interval : float, optional
         Credible interval to compute. Defaults to 0.94.
     circular : bool, optional
@@ -326,10 +339,22 @@ def hpd(ary, credible_interval=None, circular=False, multimodal=False, skipna=Fa
         modes are well separated.
     skipna : bool
         If true ignores nan values when computing the hpd interval. Defaults to false.
+    group : str, optional
+         Specifies which InferenceData group should be used to calculate hpd.
+         Defaults to 'posterior'
+    var_names : list, optional
+        Names of variables to include in the hpd report
+    coords: mapping, optional
+        Specifies the subset over to calculate hpd.
+    max_modes: int, optional
+        Specifies the maximume number of modes for multimodal case.
+    kwargs : dict, optional
+        Additional keywords passed to `wrap_xarray_ufunc`.
+        See the docstring of :obj:`wrap_xarray_ufunc method </.stats_utils.wrap_xarray_ufunc>`.
 
     Returns
     -------
-    np.ndarray
+    np.ndarray or xarray.Dataset, depending upon input
         lower(s) and upper(s) values of the interval(s).
 
     Examples
@@ -342,6 +367,34 @@ def hpd(ary, credible_interval=None, circular=False, multimodal=False, skipna=Fa
            ...: import numpy as np
            ...: data = np.random.normal(size=2000)
            ...: az.hpd(data, credible_interval=.68)
+
+    Calculate the hpd of a dataset:
+
+    .. ipython::
+
+        In [1]: import arviz as az
+           ...: data = az.load_arviz_data('centered_eight')
+           ...: az.hpd(data)
+
+    We can also calculate the hpd of some of the variables of dataset:
+
+    .. ipython::
+
+        In [1]: az.hpd(data, var_names=["mu", "theta"])
+
+    If we want to calculate the hpd over specified dimension of dataset,
+    we can pass `input_core_dims` by kwargs:
+
+    .. ipython::
+
+        In [1]: az.hpd(data, input_core_dims = [["chain"]])
+
+    We can also calculate the hpd over a particular selection over all groups:
+
+    .. ipython::
+
+        In [1]: az.hpd(data, coords={"chain":[0, 1, 3]}, input_core_dims = [["draw"]])
+
     """
     if credible_interval is None:
         credible_interval = rcParams["stats.credible_interval"]
@@ -349,84 +402,113 @@ def hpd(ary, credible_interval=None, circular=False, multimodal=False, skipna=Fa
         if not 1 >= credible_interval > 0:
             raise ValueError("The value of credible_interval should be in the interval (0, 1]")
 
-    if ary.ndim > 1:
-        hpd_array = np.array(
-            [
-                hpd(
-                    row,
-                    credible_interval=credible_interval,
-                    circular=circular,
-                    multimodal=multimodal,
-                )
-                for row in ary.T
-            ]
-        )
-        return hpd_array
+    func_kwargs = {
+        "credible_interval": credible_interval,
+        "skipna": skipna,
+        "out_shape": (max_modes, 2,) if multimodal else (2,),
+    }
+    kwargs.setdefault("output_core_dims", [["hpd", "mode"] if multimodal else ["hpd"]])
+    if not multimodal:
+        func_kwargs["circular"] = circular
+    else:
+        func_kwargs["max_modes"] = max_modes
 
-    if multimodal:
-        if skipna:
-            ary = ary[~np.isnan(ary)]
+    func = _hpd_multimodal if multimodal else _hpd
 
-        if ary.dtype.kind == "f":
-            density, lower, upper = _fast_kde(ary)
-            range_x = upper - lower
-            dx = range_x / len(density)
-            bins = np.linspace(lower, upper, len(density))
-        else:
-            bins = get_bins(ary)
-            _, density, _ = histogram(ary, bins=bins)
-            dx = np.diff(bins)[0]
+    isarray = isinstance(ary, np.ndarray)
+    if isarray and ary.ndim <= 1:
+        func_kwargs.pop("out_shape")
+        hpd_data = func(ary, **func_kwargs)  # pylint: disable=unexpected-keyword-arg
+        return hpd_data[~np.isnan(hpd_data).all(axis=1), :] if multimodal else hpd_data
 
-        density *= dx
+    if isarray and ary.ndim == 2:
+        kwargs.setdefault("input_core_dims", [["chain"]])
 
-        idx = np.argsort(-density)
-        intervals = bins[idx][density[idx].cumsum() <= credible_interval]
-        intervals.sort()
+    ary = convert_to_dataset(ary, group=group)
+    if coords is not None:
+        ary = get_coords(ary, coords)
+    var_names = _var_names(var_names, ary)
+    ary = ary[var_names] if var_names else ary
+
+    hpd_data = _wrap_xarray_ufunc(func, ary, func_kwargs=func_kwargs, **kwargs)
+    hpd_data = hpd_data.dropna("mode", how="all") if multimodal else hpd_data
+    return hpd_data.x.values if isarray else hpd_data
+
+
+def _hpd(ary, credible_interval, circular, skipna):
+    """Compute hpd over the flattened array."""
+    ary = ary.flatten()
+    if skipna:
+        nans = np.isnan(ary)
+        if not nans.all():
+            ary = ary[~nans]
+    n = len(ary)
 
-        intervals_splitted = np.split(intervals, np.where(np.diff(intervals) >= dx * 1.1)[0] + 1)
+    if circular:
+        mean = st.circmean(ary, high=np.pi, low=-np.pi)
+        ary = ary - mean
+        ary = np.arctan2(np.sin(ary), np.cos(ary))
 
-        hpd_intervals = []
-        for interval in intervals_splitted:
-            if interval.size == 0:
-                hpd_intervals.append((bins[0], bins[0]))
-            else:
-                hpd_intervals.append((interval[0], interval[-1]))
+    ary = np.sort(ary)
+    interval_idx_inc = int(np.floor(credible_interval * n))
+    n_intervals = n - interval_idx_inc
+    interval_width = ary[interval_idx_inc:] - ary[:n_intervals]
 
-        hpd_intervals = np.array(hpd_intervals)
+    if len(interval_width) == 0:
+        raise ValueError("Too few elements for interval calculation. ")
 
-    else:
-        if skipna:
-            nans = np.isnan(ary)
-            if not nans.all():
-                ary = ary[~nans]
-        n = len(ary)
+    min_idx = np.argmin(interval_width)
+    hdi_min = ary[min_idx]
+    hdi_max = ary[min_idx + interval_idx_inc]
 
-        if circular:
-            mean = st.circmean(ary, high=np.pi, low=-np.pi)
-            ary = ary - mean
-            ary = np.arctan2(np.sin(ary), np.cos(ary))
+    if circular:
+        hdi_min = hdi_min + mean
+        hdi_max = hdi_max + mean
+        hdi_min = np.arctan2(np.sin(hdi_min), np.cos(hdi_min))
+        hdi_max = np.arctan2(np.sin(hdi_max), np.cos(hdi_max))
 
-        ary = np.sort(ary)
-        interval_idx_inc = int(np.floor(credible_interval * n))
-        n_intervals = n - interval_idx_inc
-        interval_width = ary[interval_idx_inc:] - ary[:n_intervals]
+    hpd_intervals = np.array([hdi_min, hdi_max])
 
-        if len(interval_width) == 0:
-            raise ValueError("Too few elements for interval calculation. ")
+    return hpd_intervals
 
-        min_idx = np.argmin(interval_width)
-        hdi_min = ary[min_idx]
-        hdi_max = ary[min_idx + interval_idx_inc]
 
-        if circular:
-            hdi_min = hdi_min + mean
-            hdi_max = hdi_max + mean
-            hdi_min = np.arctan2(np.sin(hdi_min), np.cos(hdi_min))
-            hdi_max = np.arctan2(np.sin(hdi_max), np.cos(hdi_max))
+def _hpd_multimodal(ary, credible_interval, skipna, max_modes):
+    """Compute hpd if the distribution is multimodal."""
+    ary = ary.flatten()
+    if skipna:
+        ary = ary[~np.isnan(ary)]
 
-        hpd_intervals = np.array([hdi_min, hdi_max])
+    if ary.dtype.kind == "f":
+        density, lower, upper = _fast_kde(ary)
+        range_x = upper - lower
+        dx = range_x / len(density)
+        bins = np.linspace(lower, upper, len(density))
+    else:
+        bins = get_bins(ary)
+        _, density, _ = histogram(ary, bins=bins)
+        dx = np.diff(bins)[0]
 
-    return hpd_intervals
+    density *= dx
+
+    idx = np.argsort(-density)
+    intervals = bins[idx][density[idx].cumsum() <= credible_interval]
+    intervals.sort()
+
+    intervals_splitted = np.split(intervals, np.where(np.diff(intervals) >= dx * 1.1)[0] + 1)
+
+    hpd_intervals = np.full((max_modes, 2,), np.nan,)
+    for i, interval in enumerate(intervals_splitted):
+        if i == max_modes:
+            warnings.warn(
+                "found more modes than {0}, returning only the first {0} modes", max_modes
+            )
+            break
+        if interval.size == 0:
+            hpd_intervals[i] = np.asarray([bins[0], bins[0]])
+        else:
+            hpd_intervals[i] = np.asarray([interval[0], interval[-1]])
+
+    return np.array(hpd_intervals)
 
 
 def loo(data, pointwise=False, reff=None, scale=None):
diff --git a/setup.py b/setup.py
index 1c6bf65..88dafcf 100644
--- a/setup.py
+++ b/setup.py
@@ -59,4 +59,19 @@ setup(
     long_description=get_long_description(),
     long_description_content_type="text/markdown",
     include_package_data=True,
+    classifiers=[
+        "Development Status :: 4 - Beta",
+        "Framework :: Matplotlib",
+        "Intended Audience :: Science/Research",
+        "Intended Audience :: Education",
+        "License :: OSI Approved :: Apache Software License",
+        "Programming Language :: Python",
+        "Programming Language :: Python :: 3",
+        "Programming Language :: Python :: 3.6",
+        "Programming Language :: Python :: 3.7",
+        "Programming Language :: Python :: 3.8",
+        "Topic :: Scientific/Engineering",
+        "Topic :: Scientific/Engineering :: Visualization",
+        "Topic :: Scientific/Engineering :: Mathematics",
+    ],
 )

Unexpected behavior when using `pm.hpd` with multidimensional (ndim>2)posterior arrays
**Describe the bug**
I am using `hpd` on multi-dimensional posteriors with larger than 2 dimensions. One example of where this can come up is if I use a 2D array to represent the coefficients for the interaction between levels of 2 different predictors. The output trace of this 2D array of coefficients from PyMC3 will now be 3D, with the 0th dimension representing the MCMC samples.

I find that with a 3D trace/array, `hpd` treats dimension 1 as the MCMC dimension (instead of dimension 0, the actual MCMC dimension) 

**To Reproduce**
```
#12000 MCMC samples from a 10x3 dimensional distribution
a = np.random.normal(size=(12000, 10, 3))
pm.hpd(a).shape
```

**Output: (3, 12000, 2)** 
**Should instead be: (10, 3, 2)**

This happens because the assumption in `hpd` is that `ndim==2` if `ndim>1`: https://github.com/arviz-devs/arviz/blob/master/arviz/stats/stats.py#L346

`for row in ary.T` works properly for arrays that have 2 dimensions, but for anything larger than that, it infers the wrong MCMC dimension.

**Suggestion:** Will it make sense to have an `axis` parameter to specify the axis of the MCMC samples, much like say `np.mean` etc? 
diff --git a/arviz/tests/base_tests/test_stats.py b/arviz/tests/base_tests/test_stats.py
index b1cebd4..6ee7811 100644
--- a/arviz/tests/base_tests/test_stats.py
+++ b/arviz/tests/base_tests/test_stats.py
@@ -45,6 +45,52 @@ def test_hpd():
     assert_array_almost_equal(interval, [-1.88, 1.88], 2)
 
 
+def test_hpd_2darray():
+    normal_sample = np.random.randn(12000, 5)
+    result = hpd(normal_sample)
+    assert result.shape == (5, 2,)
+
+
+def test_hpd_multidimension():
+    normal_sample = np.random.randn(12000, 10, 3)
+    result = hpd(normal_sample)
+    assert result.shape == (3, 2,)
+
+
+def test_hpd_idata(centered_eight):
+    data = centered_eight.posterior
+    result = hpd(data)
+    assert isinstance(result, Dataset)
+    assert result.dims == {"school": 8, "hpd": 2}
+
+    result = hpd(data, input_core_dims=[["chain"]])
+    assert isinstance(result, Dataset)
+    assert result.dims == {"draw": 500, "hpd": 2, "school": 8}
+
+
+def test_hpd_idata_varnames(centered_eight):
+    data = centered_eight.posterior
+    result = hpd(data, var_names=["mu", "theta"])
+    assert isinstance(result, Dataset)
+    assert result.dims == {"hpd": 2, "school": 8}
+    assert list(result.data_vars.keys()) == ["mu", "theta"]
+
+
+def test_hpd_idata_group(centered_eight):
+    result_posterior = hpd(centered_eight, group="posterior", var_names="mu")
+    result_prior = hpd(centered_eight, group="prior", var_names="mu")
+    assert result_prior.dims == {"hpd": 2}
+    range_posterior = result_posterior.mu.values[1] - result_posterior.mu.values[0]
+    range_prior = result_prior.mu.values[1] - result_prior.mu.values[0]
+    assert range_posterior < range_prior
+
+
+def test_hpd_coords(centered_eight):
+    data = centered_eight.posterior
+    result = hpd(data, coords={"chain": [0, 1, 3]}, input_core_dims=[["draw"]])
+    assert_array_equal(result.coords["chain"], [0, 1, 3])
+
+
 def test_hpd_multimodal():
     normal_sample = np.concatenate(
         (np.random.normal(-4, 1, 2500000), np.random.normal(2, 0.5, 2500000))

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.6
requirements.txt requirements-dev.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
-e git+https://github.com/arviz-devs/arviz.git@9909aab2e4a1a4ad897c31c3dac2487037d0c3ad#egg=arviz
astroid==2.11.7
attrs==22.2.0
Babel==2.11.0
black==22.8.0
certifi==2021.5.30
cftime==1.6.0
charset-normalizer==2.0.12
click==8.0.4
coverage==6.2
cycler==0.11.0
dataclasses==0.8
dill==0.3.4
docutils==0.18.1
idna==3.10
imagesize==1.4.1
importlib-metadata==4.8.3
iniconfig==1.1.1
isort==5.10.1
Jinja2==3.0.3
kiwisolver==1.3.1
lazy-object-proxy==1.7.1
MarkupSafe==2.0.1
matplotlib==3.3.4
mccabe==0.7.0
mypy-extensions==1.0.0
netCDF4==1.6.1
numpy==1.19.5
numpydoc==1.1.0
packaging==21.3
pandas==1.1.5
pathspec==0.9.0
Pillow==8.4.0
platformdirs==2.4.0
pluggy==1.0.0
py==1.11.0
pydocstyle==6.3.0
Pygments==2.14.0
pylint==2.13.9
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.27.1
scipy==1.5.4
six==1.17.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
tomli==1.2.3
typed-ast==1.5.5
typing_extensions==4.1.1
urllib3==1.26.20
wrapt==1.16.0
xarray==0.16.2
zipp==3.6.0

name: arviz
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - astroid==2.11.7
      - attrs==22.2.0
      - babel==2.11.0
      - black==22.8.0
      - cftime==1.6.0
      - charset-normalizer==2.0.12
      - click==8.0.4
      - coverage==6.2
      - cycler==0.11.0
      - dataclasses==0.8
      - dill==0.3.4
      - docutils==0.18.1
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - isort==5.10.1
      - jinja2==3.0.3
      - kiwisolver==1.3.1
      - lazy-object-proxy==1.7.1
      - markupsafe==2.0.1
      - matplotlib==3.3.4
      - mccabe==0.7.0
      - mypy-extensions==1.0.0
      - netcdf4==1.6.1
      - numpy==1.19.5
      - numpydoc==1.1.0
      - packaging==21.3
      - pandas==1.1.5
      - pathspec==0.9.0
      - pillow==8.4.0
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - py==1.11.0
      - pydocstyle==6.3.0
      - pygments==2.14.0
      - pylint==2.13.9
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.27.1
      - scipy==1.5.4
      - six==1.17.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - tomli==1.2.3
      - typed-ast==1.5.5
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - wrapt==1.16.0
      - xarray==0.16.2
      - zipp==3.6.0
prefix: /opt/conda/envs/arviz

arviz/tests/base_tests/test_stats.py::test_hpd_multidimension arviz/tests/base_tests/test_stats.py::test_hpd_idata arviz/tests/base_tests/test_stats.py::test_hpd_idata_varnames arviz/tests/base_tests/test_stats.py::test_hpd_idata_group arviz/tests/base_tests/test_stats.py::test_hpd_coords
arviz/tests/base_tests/test_stats.py::test_hpd arviz/tests/base_tests/test_stats.py::test_hpd_2darray arviz/tests/base_tests/test_stats.py::test_hpd_multimodal arviz/tests/base_tests/test_stats.py::test_hpd_circular arviz/tests/base_tests/test_stats.py::test_hpd_bad_ci arviz/tests/base_tests/test_stats.py::test_hpd_skipna arviz/tests/base_tests/test_stats.py::test_r2_score arviz/tests/base_tests/test_stats.py::test_r2_score_multivariate arviz/tests/base_tests/test_stats.py::test_compare_same[True-stacking] arviz/tests/base_tests/test_stats.py::test_compare_same[True-BB-pseudo-BMA] arviz/tests/base_tests/test_stats.py::test_compare_same[True-pseudo-BMA] arviz/tests/base_tests/test_stats.py::test_compare_same[False-stacking] arviz/tests/base_tests/test_stats.py::test_compare_same[False-BB-pseudo-BMA] arviz/tests/base_tests/test_stats.py::test_compare_same[False-pseudo-BMA] arviz/tests/base_tests/test_stats.py::test_compare_unknown_ic_and_method arviz/tests/base_tests/test_stats.py::test_compare_different[log-stacking-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[log-stacking-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[log-BB-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[log-BB-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[log-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[log-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[negative_log-stacking-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[negative_log-stacking-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[negative_log-BB-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[negative_log-BB-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[negative_log-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[negative_log-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[deviance-stacking-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[deviance-stacking-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[deviance-BB-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[deviance-BB-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different[deviance-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different[deviance-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different_multidim[stacking-loo] arviz/tests/base_tests/test_stats.py::test_compare_different_multidim[stacking-waic] arviz/tests/base_tests/test_stats.py::test_compare_different_multidim[BB-pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different_multidim[BB-pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different_multidim[pseudo-BMA-loo] arviz/tests/base_tests/test_stats.py::test_compare_different_multidim[pseudo-BMA-waic] arviz/tests/base_tests/test_stats.py::test_compare_different_size arviz/tests/base_tests/test_stats.py::test_summary_var_names[var_names_expected0] arviz/tests/base_tests/test_stats.py::test_summary_var_names[var_names_expected1] arviz/tests/base_tests/test_stats.py::test_summary_var_names[var_names_expected2] arviz/tests/base_tests/test_stats.py::test_summary_kind[params0] arviz/tests/base_tests/test_stats.py::test_summary_kind[params1] arviz/tests/base_tests/test_stats.py::test_summary_kind[params2] arviz/tests/base_tests/test_stats.py::test_summary_fmt[wide] arviz/tests/base_tests/test_stats.py::test_summary_fmt[long] arviz/tests/base_tests/test_stats.py::test_summary_fmt[xarray] arviz/tests/base_tests/test_stats.py::test_summary_unpack_order[C] arviz/tests/base_tests/test_stats.py::test_summary_unpack_order[F] arviz/tests/base_tests/test_stats.py::test_summary_index_origin[0] arviz/tests/base_tests/test_stats.py::test_summary_index_origin[1] arviz/tests/base_tests/test_stats.py::test_summary_index_origin[2] arviz/tests/base_tests/test_stats.py::test_summary_index_origin[3] arviz/tests/base_tests/test_stats.py::test_summary_stat_func[stat_funcs0] arviz/tests/base_tests/test_stats.py::test_summary_stat_func[stat_funcs1] arviz/tests/base_tests/test_stats.py::test_summary_nan arviz/tests/base_tests/test_stats.py::test_summary_skip_nan arviz/tests/base_tests/test_stats.py::test_summary_bad_fmt[1] arviz/tests/base_tests/test_stats.py::test_summary_bad_fmt[bad_fmt] arviz/tests/base_tests/test_stats.py::test_summary_bad_unpack_order[1] arviz/tests/base_tests/test_stats.py::test_summary_bad_unpack_order[bad_order] arviz/tests/base_tests/test_stats.py::test_waic[True-log] arviz/tests/base_tests/test_stats.py::test_waic[True-negative_log] arviz/tests/base_tests/test_stats.py::test_waic[True-deviance] arviz/tests/base_tests/test_stats.py::test_waic[False-log] arviz/tests/base_tests/test_stats.py::test_waic[False-negative_log] arviz/tests/base_tests/test_stats.py::test_waic[False-deviance] arviz/tests/base_tests/test_stats.py::test_waic_bad arviz/tests/base_tests/test_stats.py::test_waic_bad_scale arviz/tests/base_tests/test_stats.py::test_waic_warning arviz/tests/base_tests/test_stats.py::test_waic_print[log] arviz/tests/base_tests/test_stats.py::test_waic_print[negative_log] arviz/tests/base_tests/test_stats.py::test_waic_print[deviance] arviz/tests/base_tests/test_stats.py::test_loo[True-log] arviz/tests/base_tests/test_stats.py::test_loo[True-negative_log] arviz/tests/base_tests/test_stats.py::test_loo[True-deviance] arviz/tests/base_tests/test_stats.py::test_loo[False-log] arviz/tests/base_tests/test_stats.py::test_loo[False-negative_log] arviz/tests/base_tests/test_stats.py::test_loo[False-deviance] arviz/tests/base_tests/test_stats.py::test_loo_one_chain arviz/tests/base_tests/test_stats.py::test_loo_bad arviz/tests/base_tests/test_stats.py::test_loo_bad_scale arviz/tests/base_tests/test_stats.py::test_loo_bad_no_posterior_reff arviz/tests/base_tests/test_stats.py::test_loo_warning arviz/tests/base_tests/test_stats.py::test_loo_print[log] arviz/tests/base_tests/test_stats.py::test_loo_print[negative_log] arviz/tests/base_tests/test_stats.py::test_loo_print[deviance] arviz/tests/base_tests/test_stats.py::test_psislw arviz/tests/base_tests/test_stats.py::test_gpinv[0--1-True] arviz/tests/base_tests/test_stats.py::test_gpinv[0--1-False] arviz/tests/base_tests/test_stats.py::test_gpinv[0--0.5-True] arviz/tests/base_tests/test_stats.py::test_gpinv[0--0.5-False] arviz/tests/base_tests/test_stats.py::test_gpinv[0-1e-30-True] arviz/tests/base_tests/test_stats.py::test_gpinv[0-1e-30-False] arviz/tests/base_tests/test_stats.py::test_gpinv[0-0.5-True] arviz/tests/base_tests/test_stats.py::test_gpinv[0-0.5-False] arviz/tests/base_tests/test_stats.py::test_gpinv[0-1-True] arviz/tests/base_tests/test_stats.py::test_gpinv[0-1-False] arviz/tests/base_tests/test_stats.py::test_gpinv[2--1-True] arviz/tests/base_tests/test_stats.py::test_gpinv[2--1-False] arviz/tests/base_tests/test_stats.py::test_gpinv[2--0.5-True] arviz/tests/base_tests/test_stats.py::test_gpinv[2--0.5-False] arviz/tests/base_tests/test_stats.py::test_gpinv[2-1e-30-True] arviz/tests/base_tests/test_stats.py::test_gpinv[2-1e-30-False] arviz/tests/base_tests/test_stats.py::test_gpinv[2-0.5-True] arviz/tests/base_tests/test_stats.py::test_gpinv[2-0.5-False] arviz/tests/base_tests/test_stats.py::test_gpinv[2-1-True] arviz/tests/base_tests/test_stats.py::test_gpinv[2-1-False] arviz/tests/base_tests/test_stats.py::test_multidimensional_log_likelihood[loo] arviz/tests/base_tests/test_stats.py::test_multidimensional_log_likelihood[waic] arviz/tests/base_tests/test_stats.py::test_loo_pit[args0] arviz/tests/base_tests/test_stats.py::test_loo_pit[args1] arviz/tests/base_tests/test_stats.py::test_loo_pit[args2] arviz/tests/base_tests/test_stats.py::test_loo_pit[args3] arviz/tests/base_tests/test_stats.py::test_loo_pit[args4] arviz/tests/base_tests/test_stats.py::test_loo_pit[args5] arviz/tests/base_tests/test_stats.py::test_loo_pit[args6] arviz/tests/base_tests/test_stats.py::test_loo_pit[args7] arviz/tests/base_tests/test_stats.py::test_loo_pit[args8] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args0] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args1] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args2] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args3] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args4] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args5] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args6] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args7] arviz/tests/base_tests/test_stats.py::test_loo_pit_multidim[args8] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input[idataarray] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input[idatanone_ystr] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input[yarr_yhatnone] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input_type[y] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input_type[y_hat] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input_type[log_weights] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input_shape[y-y_hat1] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input_shape[y-y_hat2] arviz/tests/base_tests/test_stats.py::test_loo_pit_bad_input_shape[y_hat-log_weights] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs0-True-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs0-True-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs0-False-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs0-False-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs1-True-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs1-True-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs1-False-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs1-False-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs2-True-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs2-True-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs2-False-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs2-False-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs3-True-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs3-True-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs3-False-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs3-False-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs4-True-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs4-True-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs4-False-True] arviz/tests/base_tests/test_stats.py::test_apply_test_function[kwargs4-False-False] arviz/tests/base_tests/test_stats.py::test_apply_test_function_bad_group arviz/tests/base_tests/test_stats.py::test_apply_test_function_missing_group arviz/tests/base_tests/test_stats.py::test_apply_test_function_should_overwrite_error
setup.py README.md CHANGELOG.md arviz/stats/stats.py
setup.py README.md CHANGELOG.md arviz/stats/stats.py