9 #ifdef MOOSE_LIBTORCH_ENABLED 20 checkInputCompatibility(
const torch::Tensor & input,
const torch::Tensor & reference)
23 mooseError(
"Standardizer input must be a rank-2 tensor.");
24 if (reference.dim() != 1)
25 mooseError(
"Standardizer moments must be stored as feature vectors.");
26 if (input.size(1) != reference.size(0))
27 mooseError(
"Standardizer input dimension mismatch.");
31 toStandardizerOptions(
const torch::Tensor & tensor,
const torch::TensorOptions & options)
33 auto result = tensor.to(options.device());
34 if (result.scalar_type() != at::kDouble)
35 result = result.to(at::kDouble);
40 asFeatureVector(
const torch::Tensor & feature_vector,
const torch::Tensor & input)
42 return toStandardizerOptions(feature_vector, input.options().dtype(at::kDouble));
50 _mean = torch::zeros({long(n)}, at::kDouble);
51 _stdev = torch::ones({long(n)}, at::kDouble);
57 _mean = torch::full({1}, mean, at::kDouble);
58 _stdev = torch::full({1}, stdev, at::kDouble);
64 auto options = torch::TensorOptions().dtype(at::kDouble);
65 _mean = torch::full({long(n)}, mean, options);
66 _stdev = torch::full({long(n)}, stdev, options);
72 mooseAssert(mean.size() == stdev.size(),
73 "Provided mean and standard deviation vectors are of differing size.");
82 mooseError(
"Standardizer input must be a rank-2 tensor.");
84 _mean = torch::mean(input, 0,
false);
85 _stdev = torch::std(input, 0, 0,
false);
91 checkInputCompatibility(input,
_mean);
92 input.sub_(asFeatureVector(
_mean, input)).div_(asFeatureVector(
_stdev, input));
98 checkInputCompatibility(input,
_mean);
99 input.mul_(asFeatureVector(
_stdev, input)).add_(asFeatureVector(
_mean, input));
105 checkInputCompatibility(input,
_stdev);
106 input.mul_(asFeatureVector(
_stdev, input));
112 checkInputCompatibility(input,
_stdev);
113 input.div_(asFeatureVector(
_stdev, input));
122 auto mean_accessor = mean.accessor<
Real, 1>();
123 auto stdev_accessor = stdev.accessor<
Real, 1>();
124 unsigned int n = mean.size(0);
126 for (
unsigned int ii = 0; ii < n; ++ii)
127 dataStore(stream, mean_accessor[ii], context);
128 for (
unsigned int ii = 0; ii < n; ++ii)
129 dataStore(stream, stdev_accessor[ii], context);
147 std::vector<Real> mean(n);
148 std::vector<Real> stdev(n);
149 for (
unsigned int ii = 0; ii < n; ++ii)
150 dataLoad(stream, mean[ii], context);
151 for (
unsigned int ii = 0; ii < n; ++ii)
152 dataLoad(stream, stdev[ii], context);
153 standardizer.
set(mean, stdev);
void dataLoad(std::istream &stream, StochasticTools::Standardizer &standardizer, void *context)
void mooseError(Args &&... args)
torch::Tensor vectorToTensorCopy(const std::vector< DataType > &vector, c10::IntArrayRef sizes)
torch::Tensor toCPUContiguous(const torch::Tensor &tensor)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void dataStore(std::ostream &stream, StochasticTools::Standardizer &standardizer, void *context)