def mwv_histogram(x: np.ndarray, weights: np.ndarray, bins: int=10, range: Tuple[(float, float)]=(0, 10), flow: bool=False) -> Tuple[(np.ndarray, np.ndarray, np.ndarray)]:
    'Histogram the same data but with multiple weight variations.\n\n    Parameters\n    ----------\n    x : :obj:`numpy.ndarray`\n        data to histogram\n    weights : :obj:`numpy.ndarray`, optional\n        multidimensional array of weights for ``x`` the first element\n        of the ``shape`` attribute must be equal to the length of ``x``.\n    bins : int\n        number of bins\n    range : (float, float)\n        axis range\n    flow : bool\n        include over and underflow content in first and last bins\n\n    Returns\n    -------\n    count : :obj:`numpy.ndarray`\n        The values of the histograms calculated from the weights\n        Shape will be (bins, ``weights.shape[0]``)\n    error : :obj:`numpy.ndarray`\n        The poission uncertainty on the bin heights (shape will be\n        the same as ``count``.\n    edges : :obj:`numpy.ndarray`\n        The bin edges\n\n    Notes\n    -----\n    If ``x`` is not the same dtype as ``weights``, then it is converted\n    to the dtype of ``weights`` (for multi weight histograms we expect\n    the weights array to be larger than the data array so we prefer to\n    cast the smaller chunk of data).\n\n    '
    edges = np.linspace(range[0], range[1], (bins + 1))
    assert (x.shape[0] == weights.shape[0]), 'weights shape is not compatible with x'
    if (weights.dtype == np.float64):
        hfunc = jits._hfloat64_multiweights
    elif (weights.dtype == np.float32):
        hfunc = jits._hfloat32_multiweights
    else:
        raise TypeError('dtype of input must be float32 or float64')
    (res, err) = hfunc(x.astype(weights.dtype), weights, bins, range[0], range[1], flow)
    return (res, err, edges)
Histogram the same data but with multiple weight variations.

Parameters
----------
x : :obj:`numpy.ndarray`
    data to histogram
weights : :obj:`numpy.ndarray`, optional
    multidimensional array of weights for ``x`` the first element
    of the ``shape`` attribute must be equal to the length of ``x``.
bins : int
    number of bins
range : (float, float)
    axis range
flow : bool
    include over and underflow content in first and last bins

Returns
-------
count : :obj:`numpy.ndarray`
    The values of the histograms calculated from the weights
    Shape will be (bins, ``weights.shape[0]``)
error : :obj:`numpy.ndarray`
    The poission uncertainty on the bin heights (shape will be
    the same as ``count``.
edges : :obj:`numpy.ndarray`
    The bin edges

Notes
-----
If ``x`` is not the same dtype as ``weights``, then it is converted
to the dtype of ``weights`` (for multi weight histograms we expect
the weights array to be larger than the data array so we prefer to
cast the smaller chunk of data).
def mwv_histogram(x: np.ndarray, weights: np.ndarray, bins: int=10, range: Tuple[(float, float)]=(0, 10), flow: bool=False) -> Tuple[(np.ndarray, np.ndarray, np.ndarray)]:
    'Histogram the same data but with multiple weight variations.\n\n    Parameters\n    ----------\n    x : :obj:`numpy.ndarray`\n        data to histogram\n    weights : :obj:`numpy.ndarray`, optional\n        multidimensional array of weights for ``x`` the first element\n        of the ``shape`` attribute must be equal to the length of ``x``.\n    bins : int\n        number of bins\n    range : (float, float)\n        axis range\n    flow : bool\n        include over and underflow content in first and last bins\n\n    Returns\n    -------\n    count : :obj:`numpy.ndarray`\n        The values of the histograms calculated from the weights\n        Shape will be (bins, ``weights.shape[0]``)\n    error : :obj:`numpy.ndarray`\n        The poission uncertainty on the bin heights (shape will be\n        the same as ``count``.\n    edges : :obj:`numpy.ndarray`\n        The bin edges\n\n    Notes\n    -----\n    If ``x`` is not the same dtype as ``weights``, then it is converted\n    to the dtype of ``weights`` (for multi weight histograms we expect\n    the weights array to be larger than the data array so we prefer to\n    cast the smaller chunk of data).\n\n    '
    edges = np.linspace(range[0], range[1], (bins + 1))
    assert (x.shape[0] == weights.shape[0]), 'weights shape is not compatible with x'
    if (weights.dtype == np.float64):
        hfunc = jits._hfloat64_multiweights
    elif (weights.dtype == np.float32):
        hfunc = jits._hfloat32_multiweights
    else:
        raise TypeError('dtype of input must be float32 or float64')
    (res, err) = hfunc(x.astype(weights.dtype), weights, bins, range[0], range[1], flow)
    return (res, err, edges)