https://mooseframework.inl.gov
TestStandardizer.C
Go to the documentation of this file.
1 #ifdef MOOSE_LIBTORCH_ENABLED
2 
3 #include "gtest/gtest.h"
4 #include "Standardizer.h"
5 
6 #include <sstream>
7 #include <torch/torch.h>
8 
9 using namespace StochasticTools;
10 
12 {
13  const std::vector<double> mean_gold = {0.0, -1.0};
14  const std::vector<double> stddev_gold = {1.0, 0.0};
15 
16  torch::Tensor input_tensor = torch::tensor(
17  {{1.0, -1.0}, {-1.0, -1.0}, {1.0, -1.0}, {-1.0, -1.0}, {1.0, -1.0}, {-1.0, -1.0}},
18  {torch::kFloat64});
19 
20  StochasticTools::Standardizer standardizer;
21  standardizer.computeSet(input_tensor);
22 
23  const auto mean = standardizer.getMean();
24  const auto stddev = standardizer.getStdDev();
25 
26  ASSERT_EQ(mean.dim(), 1);
27  ASSERT_EQ(stddev.dim(), 1);
28  ASSERT_EQ(static_cast<std::size_t>(mean.size(0)), mean_gold.size());
29  ASSERT_EQ(static_cast<std::size_t>(stddev.size(0)), stddev_gold.size());
30 
31  const auto mean_accessor = mean.accessor<Real, 1>();
32  const auto stddev_accessor = stddev.accessor<Real, 1>();
33  for (std::size_t i = 0; i < mean_gold.size(); ++i)
34  EXPECT_EQ(mean_accessor[i], mean_gold[i]);
35  for (std::size_t i = 0; i < stddev_gold.size(); ++i)
36  EXPECT_EQ(stddev_accessor[i], stddev_gold[i]);
37 }
38 
39 TEST(StochasticTools, getStandardized)
40 {
41  torch::Tensor input_tensor = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
42  const auto gold = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
43 
44  StochasticTools::Standardizer standardizer;
45  standardizer.computeSet(input_tensor);
46  standardizer.getStandardized(input_tensor);
47 
48  EXPECT_TRUE(torch::allclose(input_tensor, gold));
49 }
50 
51 TEST(StochasticTools, getDestandardized)
52 {
53  torch::Tensor input_tensor = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
54  const auto gold = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
55 
56  StochasticTools::Standardizer standardizer;
57  standardizer.computeSet(input_tensor);
58  standardizer.getStandardized(input_tensor);
59  standardizer.getDestandardized(input_tensor);
60 
61  EXPECT_TRUE(torch::allclose(input_tensor, gold));
62 }
63 
64 TEST(StochasticTools, getDescaled)
65 {
66  torch::Tensor input_tensor = torch::tensor({{1.0, -1.0}, {1.0, 1.0}}, {torch::kFloat64});
67  const auto gold = torch::tensor({{0.0, -1.0}, {0.0, 1.0}}, {torch::kFloat64});
68 
69  StochasticTools::Standardizer standardizer;
70  standardizer.computeSet(input_tensor);
71  standardizer.getDescaled(input_tensor);
72 
73  EXPECT_TRUE(torch::allclose(input_tensor, gold));
74 }
75 
76 TEST(StochasticTools, getScaled)
77 {
78  torch::Tensor input_tensor = torch::tensor({{4.0, -8.0}, {-4.0, 8.0}}, {torch::kFloat64});
79  const auto reference = torch::tensor({{2.0, -4.0}, {-2.0, 4.0}}, {torch::kFloat64});
80  const auto gold = torch::tensor({{2.0, -2.0}, {-2.0, 2.0}}, {torch::kFloat64});
81 
82  StochasticTools::Standardizer standardizer;
83  standardizer.computeSet(reference);
84  standardizer.getScaled(input_tensor);
85 
86  EXPECT_TRUE(torch::allclose(input_tensor, gold));
87 }
88 
89 TEST(StochasticTools, tensorDataStoreLoad)
90 {
91  torch::Tensor stored = torch::tensor({{1.0, 2.0, 3.0}, {-4.0, -5.0, -6.0}}, {torch::kFloat64});
92 
93  std::stringbuf buffer;
94  std::iostream stream(&buffer);
95  dataStore(stream, stored, nullptr);
96 
97  torch::Tensor loaded;
98  dataLoad(stream, loaded, nullptr);
99 
100  ASSERT_EQ(loaded.size(0), stored.size(0));
101  ASSERT_EQ(loaded.size(1), stored.size(1));
102  EXPECT_TRUE(torch::allclose(loaded, stored));
103 }
104 
105 TEST(StochasticTools, tensorScalarDataStoreLoad)
106 {
107  torch::Tensor stored = torch::tensor(3.25, {torch::kFloat64});
108 
109  std::stringbuf buffer;
110  std::iostream stream(&buffer);
111  dataStore(stream, stored, nullptr);
112 
113  torch::Tensor loaded;
114  dataLoad(stream, loaded, nullptr);
115 
116  ASSERT_EQ(loaded.dim(), stored.dim());
117  EXPECT_TRUE(torch::allclose(loaded, stored));
118 }
119 
120 TEST(StochasticTools, tensorVectorDataStoreLoad)
121 {
122  torch::Tensor stored = torch::tensor({1.0, -2.0, 3.5, 7.0}, {torch::kFloat64});
123 
124  std::stringbuf buffer;
125  std::iostream stream(&buffer);
126  dataStore(stream, stored, nullptr);
127 
128  torch::Tensor loaded;
129  dataLoad(stream, loaded, nullptr);
130 
131  ASSERT_EQ(loaded.dim(), stored.dim());
132  ASSERT_EQ(loaded.size(0), stored.size(0));
133  EXPECT_TRUE(torch::allclose(loaded, stored));
134 }
135 
136 TEST(StochasticTools, tensorDataStoreLoadNonContiguous)
137 {
138  const torch::Tensor base =
139  torch::tensor({{1.0, 2.0, 3.0}, {-4.0, -5.0, -6.0}}, {torch::kFloat64});
140  torch::Tensor stored = torch::transpose(base, 0, 1);
141 
142  ASSERT_FALSE(stored.is_contiguous());
143 
144  std::stringbuf buffer;
145  std::iostream stream(&buffer);
146  dataStore(stream, stored, nullptr);
147 
148  torch::Tensor loaded;
149  dataLoad(stream, loaded, nullptr);
150 
151  ASSERT_EQ(loaded.size(0), stored.size(0));
152  ASSERT_EQ(loaded.size(1), stored.size(1));
153  EXPECT_TRUE(torch::allclose(loaded, stored));
154 }
155 
156 TEST(StochasticTools, standardizerDataStoreLoad)
157 {
158  torch::Tensor input_tensor =
159  torch::tensor({{3.0, 1.0}, {5.0, -1.0}, {7.0, 3.0}}, {torch::kFloat64});
160 
162  stored.computeSet(input_tensor);
163 
164  std::stringbuf buffer;
165  std::iostream stream(&buffer);
166  dataStore(stream, stored, nullptr);
167 
169  dataLoad(stream, loaded, nullptr);
170 
171  EXPECT_TRUE(torch::allclose(loaded.getMean(), stored.getMean()));
172  EXPECT_TRUE(torch::allclose(loaded.getStdDev(), stored.getStdDev()));
173 }
174 
175 #endif
const torch::Tensor & getMean() const
Get the mean vector.
Definition: Standardizer.h:40
TEST(StochasticTools, getMean)
const torch::Tensor & getStdDev() const
Get the standard deviation vector.
Definition: Standardizer.h:42
void dataStore(std::ostream &stream, FaceCenteredMapFunctor< T, Map > &m, void *context)
Enum for batch type in stochastic tools MultiApp.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Class for standardizing data (centering and scaling)
Definition: Standardizer.h:24
void dataLoad(std::istream &stream, FaceCenteredMapFunctor< T, Map > &m, void *context)
void computeSet(const torch::Tensor &input)
Methods for computing and setting mean and standard deviation.
Definition: Standardizer.C:79