LCOV - code coverage report
Current view: top level - src/utils - AdaptiveMonteCarloUtils.C (source / functions) Hit Total Coverage
Test: idaholab/moose stochastic_tools: f45d79 Lines: 32 37 86.5 %
Date: 2025-07-25 05:00:46 Functions: 6 7 85.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://mooseframework.inl.gov
       3             : //*
       4             : //* All rights reserved, see COPYRIGHT for full restrictions
       5             : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
       6             : //*
       7             : //* Licensed under LGPL 2.1, please see LICENSE for details
       8             : //* https://www.gnu.org/licenses/lgpl-2.1.html
       9             : 
      10             : #include "AdaptiveMonteCarloUtils.h"
      11             : #include "IndirectSort.h"
      12             : #include "libmesh/int_range.h"
      13             : 
      14             : /* AdaptiveMonteCarloUtils contains functions that are used across the Adaptive Monte
      15             :  Carlo set of algorithms.*/
      16             : 
      17             : namespace AdaptiveMonteCarloUtils
      18             : {
      19             : 
      20             : Real
      21          40 : computeSTD(const std::vector<Real> & data, const unsigned int & start_index)
      22             : {
      23          40 :   if (data.size() < start_index)
      24             :     return 0.0;
      25             :   else
      26             :   {
      27          40 :     const Real mean = computeMean(data, start_index);
      28             :     const Real sq_diff =
      29          40 :         std::accumulate(data.begin() + start_index,
      30             :                         data.end(),
      31             :                         0.0,
      32         860 :                         [&mean](Real x, Real y) { return x + (y - mean) * (y - mean); });
      33          40 :     return std::sqrt(sq_diff / (data.size() - start_index));
      34             :   }
      35             : }
      36             : 
      37             : Real
      38          80 : computeMean(const std::vector<Real> & data, const unsigned int & start_index)
      39             : {
      40          80 :   if (data.size() < start_index)
      41             :     return 0.0;
      42             :   else
      43          80 :     return std::accumulate(data.begin() + start_index, data.end(), 0.0) /
      44          80 :            (data.size() - start_index);
      45             : }
      46             : 
      47             : std::vector<std::vector<Real>>
      48          64 : sortInput(const std::vector<std::vector<Real>> & inputs,
      49             :           const std::vector<Real> & outputs,
      50             :           const unsigned int samplessub,
      51             :           const Real subset_prob)
      52             : {
      53             :   std::vector<size_t> ind;
      54          64 :   Moose::indirectSort(outputs.begin(), outputs.end(), ind);
      55             : 
      56          64 :   std::vector<std::vector<Real>> out(inputs.size(), std::vector<Real>(samplessub * subset_prob));
      57          64 :   const size_t offset = std::ceil(samplessub * (1 - subset_prob));
      58         192 :   for (const auto & j : index_range(out))
      59         384 :     for (const auto & i : index_range(out[j]))
      60         256 :       out[j][i] = inputs[j][ind[i + offset]];
      61             : 
      62          64 :   return out;
      63             : }
      64             : 
      65             : std::vector<Real>
      66          32 : sortOutput(const std::vector<Real> & outputs, const unsigned int samplessub, const Real subset_prob)
      67             : {
      68             :   std::vector<size_t> ind;
      69          32 :   Moose::indirectSort(outputs.begin(), outputs.end(), ind);
      70             : 
      71          32 :   std::vector<Real> out(samplessub * subset_prob);
      72          32 :   const size_t offset = std::round(samplessub * (1 - subset_prob));
      73          96 :   for (const auto & i : index_range(out))
      74          64 :     out[i] = outputs[ind[i + offset]];
      75             : 
      76          32 :   return out;
      77             : }
      78             : 
      79             : Real
      80          32 : computeMin(const std::vector<Real> & data)
      81             : {
      82          32 :   return *std::min_element(data.begin(), data.end());
      83             : }
      84             : 
      85             : std::vector<Real>
      86           0 : computeVectorABS(const std::vector<Real> & data)
      87             : {
      88           0 :   std::vector<Real> data_abs(data.size());
      89           0 :   for (unsigned int i = 0; i < data.size(); ++i)
      90           0 :     data_abs[i] = std::abs(data[i]);
      91           0 :   return data_abs;
      92             : }
      93             : 
      94             : unsigned int
      95         600 : weightedResample(const std::vector<Real> & weights, Real rnd)
      96             : {
      97             :   unsigned int req_index = 0;
      98        2920 :   for (unsigned int i = 0; i < weights.size(); ++i)
      99             :   {
     100        2920 :     if (rnd < weights[i])
     101             :     {
     102             :       req_index = i;
     103             :       break;
     104             :     }
     105        2320 :     rnd -= weights[i];
     106             :   }
     107         600 :   return req_index;
     108             : }
     109             : } // namespace AdaptiveMonteCarloUtils

Generated by: LCOV version 1.14