https://mooseframework.inl.gov
AdaptiveMonteCarloUtils.C
Go to the documentation of this file.
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 
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 
18 {
19 
20 Real
21 computeSTD(const std::vector<Real> & data, const unsigned int & start_index)
22 {
23  if (data.size() < start_index)
24  return 0.0;
25  else
26  {
27  const Real mean = computeMean(data, start_index);
28  const Real sq_diff =
29  std::accumulate(data.begin() + start_index,
30  data.end(),
31  0.0,
32  [&mean](Real x, Real y) { return x + (y - mean) * (y - mean); });
33  return std::sqrt(sq_diff / (data.size() - start_index));
34  }
35 }
36 
37 Real
38 computeMean(const std::vector<Real> & data, const unsigned int & start_index)
39 {
40  if (data.size() < start_index)
41  return 0.0;
42  else
43  return std::accumulate(data.begin() + start_index, data.end(), 0.0) /
44  (data.size() - start_index);
45 }
46 
47 std::vector<std::vector<Real>>
48 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  Moose::indirectSort(outputs.begin(), outputs.end(), ind);
55 
56  std::vector<std::vector<Real>> out(inputs.size(), std::vector<Real>(samplessub * subset_prob));
57  const size_t offset = std::ceil(samplessub * (1 - subset_prob));
58  for (const auto & j : index_range(out))
59  for (const auto & i : index_range(out[j]))
60  out[j][i] = inputs[j][ind[i + offset]];
61 
62  return out;
63 }
64 
65 std::vector<Real>
66 sortOutput(const std::vector<Real> & outputs, const unsigned int samplessub, const Real subset_prob)
67 {
68  std::vector<size_t> ind;
69  Moose::indirectSort(outputs.begin(), outputs.end(), ind);
70 
71  std::vector<Real> out(samplessub * subset_prob);
72  const size_t offset = std::round(samplessub * (1 - subset_prob));
73  for (const auto & i : index_range(out))
74  out[i] = outputs[ind[i + offset]];
75 
76  return out;
77 }
78 
79 Real
80 computeMin(const std::vector<Real> & data)
81 {
82  return *std::min_element(data.begin(), data.end());
83 }
84 
85 std::vector<Real>
86 computeVectorABS(const std::vector<Real> & data)
87 {
88  std::vector<Real> data_abs(data.size());
89  for (unsigned int i = 0; i < data.size(); ++i)
90  data_abs[i] = std::abs(data[i]);
91  return data_abs;
92 }
93 
94 unsigned int
95 weightedResample(const std::vector<Real> & weights, Real rnd)
96 {
97  unsigned int req_index = 0;
98  for (unsigned int i = 0; i < weights.size(); ++i)
99  {
100  if (rnd < weights[i])
101  {
102  req_index = i;
103  break;
104  }
105  rnd -= weights[i];
106  }
107  return req_index;
108 }
109 } // namespace AdaptiveMonteCarloUtils
unsigned int weightedResample(const std::vector< Real > &weights, Real rnd)
return a resampled vector from a population given a weight vector.
std::vector< Real > computeVectorABS(const std::vector< Real > &data)
return the absolute values in a vector.
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
const std::vector< double > y
Real computeMean(const std::vector< Real > &data, const unsigned int &start_index)
compute the mean of a data vector by only considering values from a specific index.
Real computeMin(const std::vector< Real > &data)
return the minimum value in a vector.
const std::vector< double > x
Real computeSTD(const std::vector< Real > &data, const unsigned int &start_index)
compute the standard deviation of a data vector by only considering values from a specific index...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OStreamProxy out
std::vector< std::vector< Real > > sortInput(const std::vector< std::vector< Real >> &inputs, const std::vector< Real > &outputs, const unsigned int samplessub, const Real subset_prob)
return input values corresponding to the largest po percentile output values.
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
auto index_range(const T &sizable)
std::vector< Real > sortOutput(const std::vector< Real > &outputs, const unsigned int samplessub, const Real subset_prob)
return the largest po percentile output values.