https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
9using 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
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
39TEST(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
45 standardizer.computeSet(input_tensor);
46 standardizer.getStandardized(input_tensor);
47
48 EXPECT_TRUE(torch::allclose(input_tensor, gold));
49}
50
51TEST(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
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
64TEST(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
70 standardizer.computeSet(input_tensor);
71 standardizer.getDescaled(input_tensor);
72
73 EXPECT_TRUE(torch::allclose(input_tensor, gold));
74}
75
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
83 standardizer.computeSet(reference);
84 standardizer.getScaled(input_tensor);
85
86 EXPECT_TRUE(torch::allclose(input_tensor, gold));
87}
88
89TEST(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
105TEST(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
120TEST(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
136TEST(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
156TEST(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
void dataLoad(std::istream &stream, LineSegment &l, void *context)
void dataStore(std::ostream &stream, LineSegment &l, void *context)
TEST(StochasticTools, getMean)
Class for standardizing data (centering and scaling)
const torch::Tensor & getStdDev() const
Get the standard deviation vector.
const torch::Tensor & getMean() const
Get the mean vector.
void computeSet(const torch::Tensor &input)
Methods for computing and setting mean and standard deviation.
Enum for batch type in stochastic tools MultiApp.