https://mooseframework.inl.gov
ParallelAcquisitionFunctionBase.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
14 {
16  params.addClassDescription("Base class for parallel acquisition functions");
17  params.registerBase("ParallelAcquisitionFunctionBase");
18  params.registerSystemAttributeName("ParallelAcquisitionFunctionBase");
19  return params;
20 }
21 
23  : MooseObject(parameters)
24 {
25 }
26 
27 void
29  std::vector<Real> & acq,
30  const std::vector<Real> & gp_mean,
31  const std::vector<Real> & gp_std,
32  const std::vector<std::vector<Real>> & test_inputs,
33  const std::vector<std::vector<Real>> & train_inputs,
34  const std::vector<Real> & generic) const
35 {
36  // Size checks
37  if (test_inputs.size() == 0)
38  mooseError("computeAcquisition: test_inputs must be non-empty.");
39 
40  if (gp_mean.size() != test_inputs.size() || gp_std.size() != test_inputs.size())
41  mooseError("computeAcquisition: gp_mean, gp_std, and test_inputs must have the same length.");
42 
43  if (acq.size() != test_inputs.size())
44  mooseError("computeAcquisition: output 'acq' must be pre-sized to test_inputs.size().");
45 
46  // Dimensionality checks (all rows same dim; train dim matches test dim)
47  if (test_inputs.front().size() == 0)
48  mooseError("computeAcquisition: test_inputs row dimension must be > 0.");
49 
50  if (train_inputs[0].size() != test_inputs.front().size())
51  mooseError("computeAcquisition: train_inputs rows must match test_inputs dimension.");
52 
53  // Hand off to the derived implementation
54  computeAcquisitionInternal(acq, gp_mean, gp_std, test_inputs, train_inputs, generic);
55 }
56 
57 void
59  std::vector<unsigned int> & sorted_indices,
60  const std::vector<Real> & acq,
61  const std::vector<Real> & length_scales,
62  const std::vector<std::vector<Real>> & inputs)
63 {
64  if (inputs.size() == 0)
65  mooseError("penalizeAcquisition: 'inputs' must be non-empty.");
66  if (modified_acq.size() != inputs.size() || sorted_indices.size() != inputs.size() ||
67  acq.size() != inputs.size())
68  mooseError(
69  "penalizeAcquisition: modified_acq, sorted_indices, and acq must match inputs.size().");
70 
71  if (inputs.front().size() != inputs.front().size())
72  mooseError("penalizeAcquisition: all input rows must have the same dimension.");
73  if (length_scales.size() != inputs.front().size())
74  mooseError("penalizeAcquisition: length_scales must match input dimension.");
75 
76  std::vector<Real> negate_acq = acq;
77  std::transform(negate_acq.cbegin(), negate_acq.cend(), negate_acq.begin(), std::negate<double>());
78  std::vector<size_t> ind;
79  Moose::indirectSort(negate_acq.begin(), negate_acq.end(), ind);
80  modified_acq[0] = -negate_acq[ind[0]];
81  sorted_indices[0] = ind[0];
82 
83  Real correlation = 0.0;
84  for (unsigned int i = 0; i < inputs.size() - 1; ++i)
85  {
86  for (unsigned int j = 0; j < inputs.size(); ++j)
87  {
88  computeCorrelation(correlation, inputs[j], inputs[ind[0]], length_scales);
89  negate_acq[j] = negate_acq[j] * correlation;
90  }
91  Moose::indirectSort(negate_acq.begin(), negate_acq.end(), ind);
92  modified_acq[i + 1] = -negate_acq[ind[0]];
93  sorted_indices[i + 1] = ind[0];
94  }
95 }
96 
97 void
99  const std::vector<Real> & input1,
100  const std::vector<Real> & input2,
101  const std::vector<Real> & length_scales)
102 {
103  if (input1.size() != input2.size() || input1.size() != length_scales.size())
104  mooseError("computeCorrelation: input1, input2, and length_scales must be the same size.");
105  corr = 0.0;
106  for (unsigned int i = 0; i < input1.size(); ++i)
107  corr -= Utility::pow<2>(input1[i] - input2[i]) / (2.0 * Utility::pow<2>(length_scales[i]));
108  corr = 1.0 - std::exp(corr);
109 }
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
void registerSystemAttributeName(const std::string &value)
void penalizeAcquisition(std::vector< Real > &modified_acq, std::vector< unsigned int > &sorted_indices, const std::vector< Real > &acq, const std::vector< Real > &length_scales, const std::vector< std::vector< Real >> &inputs)
Return the modified acquisition function values and sorted indices considering local penalization (in...
void registerBase(const std::string &value)
void computeCorrelation(Real &corr, const std::vector< Real > &input1, const std::vector< Real > &input2, const std::vector< Real > &length_scales)
Compute the correlation between two inputs using the length scales.
virtual void computeAcquisitionInternal(std::vector< Real > &acq, const std::vector< Real > &gp_mean, const std::vector< Real > &gp_std, const std::vector< std::vector< Real >> &test_inputs, const std::vector< std::vector< Real >> &train_inputs, const std::vector< Real > &generic) const =0
Implementation hook for derived classes (no size checks here).
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
ParallelAcquisitionFunctionBase(const InputParameters &parameters)
static InputParameters validParams()
void computeAcquisition(std::vector< Real > &acq, const std::vector< Real > &gp_mean, const std::vector< Real > &gp_std, const std::vector< std::vector< Real >> &test_inputs, const std::vector< std::vector< Real >> &train_inputs, const std::vector< Real > &generic) const
Compute the acquisition function values.