https://mooseframework.inl.gov
LibtorchANNSurrogate.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 
10 #ifdef MOOSE_LIBTORCH_ENABLED
11 
12 #include "LibtorchANNSurrogate.h"
13 
14 registerMooseObject("StochasticToolsApp", LibtorchANNSurrogate);
15 
18 {
20  params.addClassDescription("Surrogate that evaluates a feedforward artificial neural net. ");
21  return params;
22 }
23 
25  : SurrogateModel(parameters),
26  _nn(getModelData<std::shared_ptr<Moose::LibtorchArtificialNeuralNet>>("nn")),
27  _input_standardizer(getModelData<StochasticTools::Standardizer>("input_standardizer")),
28  _output_standardizer(getModelData<StochasticTools::Standardizer>("output_standardizer"))
29 {
30  // We check if MOOSE is compiled with torch, if not this throws an error
32 }
33 
34 Real
35 LibtorchANNSurrogate::evaluate(const std::vector<Real> & x) const
36 {
37  Real val(0.0);
38 
39  // Check whether input point has same dimensionality as training data
40  mooseAssert(_nn->numInputs() == x.size(),
41  "Input point does not match dimensionality of training data.");
42 
43  std::vector<Real> converted_input(x.size(), 0);
44  const auto & input_mean = _input_standardizer.getMean();
45  const auto & input_std = _input_standardizer.getStdDev();
46 
47  mooseAssert(input_mean.size() == converted_input.size() &&
48  input_std.size() == converted_input.size(),
49  "The input standardizer's dimensions should be the same as the input dimension!");
50 
51  for (auto input_i : index_range(converted_input))
52  converted_input[input_i] = (x[input_i] - input_mean[input_i]) / input_std[input_i];
53 
54  torch::Tensor x_tf =
55  torch::tensor(torch::ArrayRef<Real>(converted_input.data(), converted_input.size()))
56  .to(at::kDouble);
57 
58  const auto & output_mean = _output_standardizer.getMean();
59  const auto & output_std = _output_standardizer.getStdDev();
60 
61  mooseAssert(output_mean.size() == 1 && output_std.size() == 1,
62  "The output standardizer's dimensions should be 1!");
63 
64  // Compute prediction
65  val = _nn->forward(x_tf).item<double>();
66  val = val * output_std[0] + output_mean[0];
67 
68  return val;
69 }
70 
71 #endif
const StochasticTools::Standardizer & _output_standardizer
Standardizer for use with output response (y)
LibtorchANNSurrogate(const InputParameters &parameters)
registerMooseObject("StochasticToolsApp", LibtorchANNSurrogate)
const StochasticTools::Standardizer & _input_standardizer
Standardizer for use with input (x)
static void requiresTorch(const MooseObject &obj)
Enum for batch type in stochastic tools MultiApp.
static InputParameters validParams()
const std::vector< double > x
virtual Real evaluate(const std::vector< Real > &x) const override
Evaluate surrogate model given a row of parameters.
const std::vector< Real > & getStdDev() const
Get the standard deviation vector.
Definition: Standardizer.h:39
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::vector< Real > & getMean() const
Get the mean vector.
Definition: Standardizer.h:37
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()
const std::shared_ptr< Moose::LibtorchArtificialNeuralNet > & _nn
Pointer to the neural net object (initialized as null)
auto index_range(const T &sizable)