LCOV - code coverage report
Current view: top level - variable - cumulative.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 31 31 100.0 %
Date: 2024-04-28 01:25:40 Functions: 4 4 100.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: BSD-3-Clause
       2             : // Copyright (c) 2023 Scipp contributors (https://github.com/scipp)
       3             : /// @file
       4             : /// @author Simon Heybrock
       5             : #include "scipp/variable/cumulative.h"
       6             : #include "scipp/core/element/cumulative.h"
       7             : #include "scipp/variable/accumulate.h"
       8             : #include "scipp/variable/astype.h"
       9             : #include "scipp/variable/util.h"
      10             : 
      11             : using namespace scipp;
      12             : 
      13             : namespace scipp::variable {
      14             : 
      15             : namespace {
      16       30864 : auto as_precise(const Variable &var) {
      17       61728 :   return (var.dtype() == dtype<float>) ? astype(var, dtype<double>) : var;
      18             : }
      19             : } // namespace
      20             : 
      21        6422 : Variable cumsum(const Variable &var, const Dim dim, const CumSumMode mode) {
      22        6422 :   if (var.dims()[dim] == 0)
      23          10 :     return copy(var);
      24       12824 :   Variable cumulative = as_precise(copy(var.slice({dim, 0})));
      25        6412 :   fill_zeros(cumulative);
      26        6412 :   Variable out = copy(var);
      27        6412 :   if (mode == CumSumMode::Inclusive)
      28           3 :     accumulate_in_place(cumulative, out, core::element::inclusive_scan,
      29             :                         "cumsum");
      30             :   else
      31        6409 :     accumulate_in_place(cumulative, out, core::element::exclusive_scan,
      32             :                         "cumsum");
      33        6412 :   return out;
      34        6412 : }
      35             : 
      36       24452 : Variable cumsum(const Variable &var, const CumSumMode mode) {
      37       48904 :   Variable cumulative(as_precise(Variable(var, Dimensions{})));
      38       24452 :   Variable out = copy(var);
      39       24452 :   if (mode == CumSumMode::Inclusive)
      40       24450 :     accumulate_in_place(cumulative, out, core::element::inclusive_scan,
      41             :                         "cumsum");
      42             :   else
      43           2 :     accumulate_in_place(cumulative, out, core::element::exclusive_scan,
      44             :                         "cumsum");
      45       48904 :   return out;
      46       24452 : }
      47             : 
      48           3 : Variable cumsum_bins(const Variable &var, const CumSumMode mode) {
      49           3 :   Variable out = copy(var);
      50           3 :   const auto type = variable::variableFactory().elem_dtype(var);
      51           3 :   auto cumulative = Variable(type == dtype<float> ? dtype<double> : type,
      52           3 :                              var.dims(), var.unit());
      53           3 :   if (mode == CumSumMode::Inclusive)
      54           2 :     accumulate_in_place(cumulative, out, core::element::inclusive_scan,
      55             :                         "cumsum_bins");
      56             :   else
      57           1 :     accumulate_in_place(cumulative, out, core::element::exclusive_scan,
      58             :                         "cumsum_bins");
      59           6 :   return out;
      60           3 : }
      61             : 
      62             : } // namespace scipp::variable

Generated by: LCOV version 1.14