9#ifdef MOOSE_LIBTORCH_ENABLED
21checkInputCompatibility(
const torch::Tensor & input,
const torch::Tensor & reference)
24 mooseError(
"Standardizer input must be a rank-2 tensor.");
25 if (reference.dim() != 1)
26 mooseError(
"Standardizer moments must be stored as feature vectors.");
27 if (input.size(1) != reference.size(0))
28 mooseError(
"Standardizer input dimension mismatch.");
32toStandardizerOptions(
const torch::Tensor & tensor,
const torch::TensorOptions & options)
34 auto result = tensor.to(options.device());
35 if (result.scalar_type() != at::kDouble)
36 result = result.to(at::kDouble);
41asFeatureVector(
const torch::Tensor & feature_vector,
const torch::Tensor & input)
43 return toStandardizerOptions(feature_vector, input.options().dtype(at::kDouble));
51 _mean = torch::zeros({long(n)}, at::kDouble);
52 _stdev = torch::ones({long(n)}, at::kDouble);
58 _mean = torch::full({1}, mean, at::kDouble);
59 _stdev = torch::full({1}, stdev, at::kDouble);
65 auto options = torch::TensorOptions().dtype(at::kDouble);
66 _mean = torch::full({long(n)}, mean, options);
67 _stdev = torch::full({long(n)}, stdev, options);
73 mooseAssert(mean.size() == stdev.size(),
74 "Provided mean and standard deviation vectors are of differing size.");
83 mooseError(
"Standardizer input must be a rank-2 tensor.");
85 _mean = torch::mean(input, 0,
false);
86 _stdev = torch::std(input, 0, 0,
false);
92 checkInputCompatibility(input,
_mean);
93 input.sub_(asFeatureVector(
_mean, input)).div_(asFeatureVector(
_stdev, input));
99 checkInputCompatibility(input,
_mean);
100 input.mul_(asFeatureVector(
_stdev, input)).add_(asFeatureVector(
_mean, input));
106 checkInputCompatibility(input,
_stdev);
107 input.mul_(asFeatureVector(
_stdev, input));
113 checkInputCompatibility(input,
_stdev);
114 input.div_(asFeatureVector(
_stdev, input));
123 auto mean_accessor = mean.accessor<Real, 1>();
124 auto stdev_accessor = stdev.accessor<Real, 1>();
125 unsigned int n = mean.size(0);
127 for (
unsigned int ii = 0; ii < n; ++ii)
129 for (
unsigned int ii = 0; ii < n; ++ii)
148 std::vector<Real> mean(n);
149 std::vector<Real> stdev(n);
150 for (
unsigned int ii = 0; ii < n; ++ii)
151 dataLoad(stream, mean[ii], context);
152 for (
unsigned int ii = 0; ii < n; ++ii)
153 dataLoad(stream, stdev[ii], context);
154 standardizer.
set(mean, stdev);
void mooseError(Args &&... args)
void dataLoad(std::istream &stream, StochasticTools::Standardizer &standardizer, void *context)
void dataStore(std::ostream &stream, StochasticTools::Standardizer &standardizer, void *context)
torch::Tensor toCPUContiguous(const torch::Tensor &tensor)
torch::Tensor vectorToTensorCopy(const std::vector< DataType > &vector, c10::IntArrayRef sizes)