Source code for qp.parameterizations.interp.interp_utils

from __future__ import annotations

from typing import Any
import numpy as np
from scipy import integrate as sciint
from scipy import interpolate as sciinterp

from ...utils.conversion import extract_xy_vals
from ..sparse_interp.sparse_rep import (
    build_sparse_representation,
    decode_sparse_indices,
)


# Conversion functions


[docs] def irreg_interp_extract_xy_vals(in_dist: "Ensemble", **kwargs): # -> dict[str, Any]: """Wrapper for extract_xy_vals. Convert using a set of x and y values. Parameters ---------- in_dist : Ensemble Input distributions xvals : np.ndarray[float] Locations at which the pdf is evaluated Returns ------- data : dict The extracted data""" xvals = kwargs.pop("xvals", None) if xvals is None: # pragma: no cover raise ValueError("To convert using extract_xy_vals you must specify xvals") return extract_xy_vals(in_dist, xvals)
[docs] def extract_vals_at_x(in_dist: "Ensemble", **kwargs) -> dict[str, np.ndarray[float]]: """Convert using a set of x and y values. Parameters ---------- in_dist : Ensemble Input distributions Other Parameters ---------------- xvals : np.ndarray[float] Locations at which the pdf is evaluated Returns ------- data : dict[str, np.ndarray[float]] The extracted data """ xvals = kwargs.pop("xvals", None) if xvals is None: # pragma: no cover raise ValueError("To convert to extract_xy_vals you must specify xvals") yvals = in_dist.pdf(xvals) return dict(xvals=xvals, yvals=yvals)
[docs] def extract_xy_sparse( in_dist: "Ensemble", **kwargs ) -> dict[str, Any]: # pragma: no cover """Extract xy-interpolated representation from an sparse representation Parameters ---------- in_dist : Ensemble Input distributions Other Parameters ---------------- xvals : ArrayLike Used to override the y-values xvals : ArrayLike Used to override the x-values nvals : int Used to override the number of bins Returns ------- metadata : dict[str, Any] Dictionary with data for interpolated representation Notes ----- This function will rebin to a grid more suited to the in_dist support by removing x-values corresponding to y=0 """ yvals = in_dist.objdata["yvals"] default = in_dist.metadata["xvals"][0] xvals = kwargs.pop("xvals", default) nvals = kwargs.pop("nvals", 300) # rebin to a grid more suited to the in_dist support xmin = np.min(xvals) _, j = np.where(yvals > 0) xmax = np.max(xvals[j]) newx = np.linspace(xmin, xmax, nvals) interp = sciinterp.interp1d(xvals, yvals, assume_sorted=True) newpdf = interp(newx) sparse_indices, sparse_meta, A = build_sparse_representation(newx, newpdf) # decode the sparse indices into basis indices and weights basis_indices, weights = decode_sparse_indices(sparse_indices) # retrieve the weighted array of basis functions for each object pdf_y = A[:, basis_indices] * weights # normalize and sum the weighted pdfs x = sparse_meta["z"] y = pdf_y.sum(axis=-1) norms = sciint.trapezoid(y.T, x) y /= norms # super(sparse_gen, self).__init__(x, y.T, *args, **kwargs) xvals = x yvals = y.T return dict(xvals=xvals, yvals=yvals, **kwargs)