https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
20Real
21computeSTD(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
37Real
38computeMean(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
47std::vector<std::vector<Real>>
48sortInput(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
65std::vector<Real>
66sortOutput(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
79Real
80computeMin(const std::vector<Real> & data)
81{
82 return *std::min_element(data.begin(), data.end());
83}
84
85std::vector<Real>
86computeVectorABS(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
94unsigned int
95weightedResample(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
const std::vector< double > y
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.
std::vector< Real > sortOutput(const std::vector< Real > &outputs, const unsigned int samplessub, const Real subset_prob)
return the largest po percentile output values.
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.
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.
std::vector< Real > computeVectorABS(const std::vector< Real > &data)
return the absolute values in a vector.
unsigned int weightedResample(const std::vector< Real > &weights, Real rnd)
return a resampled vector from a population given a weight vector.
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real