diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e0291e1b9..bf20f7f78 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,9 +2,11 @@ ## UPCOMING +* Fix scaling a weighted storage [#559][] * Support running type checking from Python < 3.8 [#542][] [#542]: https://github.com/scikit-hep/boost-histogram/pull/542 +[#559]: https://github.com/scikit-hep/boost-histogram/pull/559 ## Version 1.0 diff --git a/src/boost_histogram/_internal/hist.py b/src/boost_histogram/_internal/hist.py index 9d771eaf0..702b3c554 100644 --- a/src/boost_histogram/_internal/hist.py +++ b/src/boost_histogram/_internal/hist.py @@ -1,4 +1,5 @@ import copy +import logging import threading import typing import warnings @@ -49,6 +50,8 @@ _core.hist.any_weighted_mean, } +logger = logging.getLogger(__name__) + CppAxis = NewType("CppAxis", object) @@ -772,6 +775,7 @@ def __getitem__( # noqa: C901 assert isinstance(stop, int) slices.append(_core.algorithm.slice_and_rebin(i, start, stop, merge)) + logger.debug("Reduce with %s", slices) reduced = self._hist.reduce(*slices) if not integrations: diff --git a/src/boost_histogram/_internal/view.py b/src/boost_histogram/_internal/view.py index f9b29ccfb..3857ba670 100644 --- a/src/boost_histogram/_internal/view.py +++ b/src/boost_histogram/_internal/view.py @@ -171,14 +171,14 @@ def __array_ufunc__( ufunc(input_0["value"], input_1, out=result["value"], **kwargs) ufunc( input_0["variance"], - np.abs(input_1), + input_1 ** 2, out=result["variance"], **kwargs, ) else: ufunc(input_0, input_1["value"], out=result["value"], **kwargs) ufunc( - np.abs(input_0), + input_0 ** 2, input_1["variance"], out=result["variance"], **kwargs, diff --git a/src/register_algorithm.cpp b/src/register_algorithm.cpp index 34e38e111..ed339b86e 100644 --- a/src/register_algorithm.cpp +++ b/src/register_algorithm.cpp @@ -14,14 +14,17 @@ void register_algorithms(py::module& algorithm) { using range_t = bh::algorithm::reduce_command::range_t; if(self.range != range_t::none) { - const char* suffix = self.merge > 0 ? "_and_rebin" : ""; - const char* start = self.iaxis == bh::algorithm::reduce_command::unset - ? "" - : "iaxis={0}, "; - const char* merge = self.merge > 0 ? ", merge={3}" : ""; + const char* suffix = self.merge > 0 ? "_and_rebin" : ""; + const char* c_start = self.iaxis == bh::algorithm::reduce_command::unset + ? "" + : "iaxis={0}, "; + const char* c_merge = self.merge > 0 ? ", merge={0}" : ""; + + py::str start = py::str(c_start).format(self.iaxis); + py::str merge = py::str(c_merge).format(self.merge); if(self.range == range_t::indices) { - return py::str("reduce_command(slice{0}({1}, begin={2}, " + return py::str("reduce_command(slice{0}({1}begin={2}, " "end={3}{4}, mode={5}))") .format(suffix, start, diff --git a/tests/test_views.py b/tests/test_views.py index f0ccfa906..c2f5c746b 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -19,29 +19,29 @@ def test_basic_view(v): def test_view_mul(v): v2 = v * 2 assert_allclose(v2.value, [0, 6, 4, 2]) - assert_allclose(v2.variance, [0, 6, 4, 2]) + assert_allclose(v2.variance, [0, 12, 8, 4]) v2 = 2 * v assert_allclose(v2.value, [0, 6, 4, 2]) - assert_allclose(v2.variance, [0, 6, 4, 2]) + assert_allclose(v2.variance, [0, 12, 8, 4]) v2 = v * (-2) assert_allclose(v2.value, [0, -6, -4, -2]) - assert_allclose(v2.variance, [0, 6, 4, 2]) + assert_allclose(v2.variance, [0, 12, 8, 4]) v *= 2 assert_allclose(v.value, [0, 6, 4, 2]) - assert_allclose(v.variance, [0, 6, 4, 2]) + assert_allclose(v.variance, [0, 12, 8, 4]) def test_view_div(v): v2 = v / 2 assert_allclose(v2.value, [0, 1.5, 1, 0.5]) - assert_allclose(v2.variance, [0, 1.5, 1, 0.5]) + assert_allclose(v2.variance, [0, 0.75, 0.5, 0.25]) v2 = v / (-0.5) assert_allclose(v2.value, [0, -6, -4, -2]) - assert_allclose(v2.variance, [0, 6, 4, 2]) + assert_allclose(v2.variance, [0, 12, 8, 4]) v2 = 1 / v[1:] assert_allclose(v2.value, [1 / 3, 1 / 2, 1]) @@ -49,7 +49,7 @@ def test_view_div(v): v /= 0.5 assert_allclose(v.value, [0, 6, 4, 2]) - assert_allclose(v.variance, [0, 6, 4, 2]) + assert_allclose(v.variance, [0, 12, 8, 4]) def test_view_add(v):