https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
13
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
34Real
35LibtorchANNSurrogate::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 auto input_mean_accessor = input_mean.accessor<Real, 1>();
48 auto input_std_accessor = input_std.accessor<Real, 1>();
49
50 mooseAssert((unsigned long int)torch::size(input_mean, 0) == converted_input.size() &&
51 (unsigned long int)torch::size(input_std, 0) == converted_input.size(),
52 "The input standardizer's dimensions should be the same as the input dimension!");
53
54 for (auto input_i : index_range(converted_input))
55 converted_input[input_i] =
56 (x[input_i] - input_mean_accessor[input_i]) / input_std_accessor[input_i];
57
58 torch::Tensor x_tf =
59 torch::tensor(torch::ArrayRef<Real>(converted_input.data(), converted_input.size()))
60 .to(at::kDouble);
61
62 const auto & output_mean = _output_standardizer.getMean();
63 const auto & output_std = _output_standardizer.getStdDev();
64
65 auto output_mean_accessor = output_mean.accessor<Real, 1>();
66 auto output_std_accessor = output_std.accessor<Real, 1>();
67
68 mooseAssert(output_mean.sizes()[0] == 1 && output_std.sizes()[0] == 1,
69 "The output standardizer's dimensions should be 1!");
70
71 // Compute prediction
72 val = _nn->forward(x_tf).item<double>();
73 val = val * output_std_accessor[0] + output_mean_accessor[0];
74
75 return val;
76}
77
78#endif
const std::vector< double > x
registerMooseObject("StochasticToolsApp", LibtorchANNSurrogate)
void addClassDescription(const std::string &doc_string)
virtual Real evaluate(const std::vector< Real > &x) const override
Evaluate surrogate model given a row of parameters.
const StochasticTools::Standardizer & _output_standardizer
Standardizer for use with output response (y)
const StochasticTools::Standardizer & _input_standardizer
Standardizer for use with input (x)
const std::shared_ptr< Moose::LibtorchArtificialNeuralNet > & _nn
Pointer to the neural net object (initialized as null)
static InputParameters validParams()
LibtorchANNSurrogate(const InputParameters &parameters)
static void requiresTorch(const MooseObject &obj)
const torch::Tensor & getStdDev() const
Get the standard deviation vector.
const torch::Tensor & getMean() const
Get the mean vector.
static InputParameters validParams()
Enum for batch type in stochastic tools MultiApp.