https://mooseframework.inl.gov
Loading...
Searching...
No Matches
TestStandardizer.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
12#include "gtest/gtest.h"
13#include "Standardizer.h"
14
15#include <sstream>
16#include <torch/torch.h>
17
18using namespace StochasticTools;
19
21{
22 const std::vector<double> mean_gold = {0.0, -1.0};
23 const std::vector<double> stddev_gold = {1.0, 0.0};
24
25 torch::Tensor input_tensor = torch::tensor(
26 {{1.0, -1.0}, {-1.0, -1.0}, {1.0, -1.0}, {-1.0, -1.0}, {1.0, -1.0}, {-1.0, -1.0}},
27 {torch::kFloat64});
28
30 standardizer.computeSet(input_tensor);
31
32 const auto mean = standardizer.getMean();
33 const auto stddev = standardizer.getStdDev();
34
35 ASSERT_EQ(mean.dim(), 1);
36 ASSERT_EQ(stddev.dim(), 1);
37 ASSERT_EQ(static_cast<std::size_t>(mean.size(0)), mean_gold.size());
38 ASSERT_EQ(static_cast<std::size_t>(stddev.size(0)), stddev_gold.size());
39
40 const auto mean_accessor = mean.accessor<Real, 1>();
41 const auto stddev_accessor = stddev.accessor<Real, 1>();
42 for (std::size_t i = 0; i < mean_gold.size(); ++i)
43 EXPECT_EQ(mean_accessor[i], mean_gold[i]);
44 for (std::size_t i = 0; i < stddev_gold.size(); ++i)
45 EXPECT_EQ(stddev_accessor[i], stddev_gold[i]);
46}
47
48TEST(StochasticTools, getStandardized)
49{
50 torch::Tensor input_tensor = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
51 const auto gold = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
52
54 standardizer.computeSet(input_tensor);
55 standardizer.getStandardized(input_tensor);
56
57 EXPECT_TRUE(torch::allclose(input_tensor, gold));
58}
59
60TEST(StochasticTools, getDestandardized)
61{
62 torch::Tensor input_tensor = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
63 const auto gold = torch::tensor({{1.0, -1.0}, {-1.0, 1.0}}, {torch::kFloat64});
64
66 standardizer.computeSet(input_tensor);
67 standardizer.getStandardized(input_tensor);
68 standardizer.getDestandardized(input_tensor);
69
70 EXPECT_TRUE(torch::allclose(input_tensor, gold));
71}
72
73TEST(StochasticTools, getDescaled)
74{
75 torch::Tensor input_tensor = torch::tensor({{1.0, -1.0}, {1.0, 1.0}}, {torch::kFloat64});
76 const auto gold = torch::tensor({{0.0, -1.0}, {0.0, 1.0}}, {torch::kFloat64});
77
79 standardizer.computeSet(input_tensor);
80 standardizer.getDescaled(input_tensor);
81
82 EXPECT_TRUE(torch::allclose(input_tensor, gold));
83}
84
86{
87 torch::Tensor input_tensor = torch::tensor({{4.0, -8.0}, {-4.0, 8.0}}, {torch::kFloat64});
88 const auto reference = torch::tensor({{2.0, -4.0}, {-2.0, 4.0}}, {torch::kFloat64});
89 const auto gold = torch::tensor({{2.0, -2.0}, {-2.0, 2.0}}, {torch::kFloat64});
90
92 standardizer.computeSet(reference);
93 standardizer.getScaled(input_tensor);
94
95 EXPECT_TRUE(torch::allclose(input_tensor, gold));
96}
97
98TEST(StochasticTools, tensorDataStoreLoad)
99{
100 torch::Tensor stored = torch::tensor({{1.0, 2.0, 3.0}, {-4.0, -5.0, -6.0}}, {torch::kFloat64});
101
102 std::stringbuf buffer;
103 std::iostream stream(&buffer);
104 dataStore(stream, stored, nullptr);
105
106 torch::Tensor loaded;
107 dataLoad(stream, loaded, nullptr);
108
109 ASSERT_EQ(loaded.size(0), stored.size(0));
110 ASSERT_EQ(loaded.size(1), stored.size(1));
111 EXPECT_TRUE(torch::allclose(loaded, stored));
112}
113
114TEST(StochasticTools, tensorScalarDataStoreLoad)
115{
116 torch::Tensor stored = torch::tensor(3.25, {torch::kFloat64});
117
118 std::stringbuf buffer;
119 std::iostream stream(&buffer);
120 dataStore(stream, stored, nullptr);
121
122 torch::Tensor loaded;
123 dataLoad(stream, loaded, nullptr);
124
125 ASSERT_EQ(loaded.dim(), stored.dim());
126 EXPECT_TRUE(torch::allclose(loaded, stored));
127}
128
129TEST(StochasticTools, tensorVectorDataStoreLoad)
130{
131 torch::Tensor stored = torch::tensor({1.0, -2.0, 3.5, 7.0}, {torch::kFloat64});
132
133 std::stringbuf buffer;
134 std::iostream stream(&buffer);
135 dataStore(stream, stored, nullptr);
136
137 torch::Tensor loaded;
138 dataLoad(stream, loaded, nullptr);
139
140 ASSERT_EQ(loaded.dim(), stored.dim());
141 ASSERT_EQ(loaded.size(0), stored.size(0));
142 EXPECT_TRUE(torch::allclose(loaded, stored));
143}
144
145TEST(StochasticTools, tensorDataStoreLoadNonContiguous)
146{
147 const torch::Tensor base =
148 torch::tensor({{1.0, 2.0, 3.0}, {-4.0, -5.0, -6.0}}, {torch::kFloat64});
149 torch::Tensor stored = torch::transpose(base, 0, 1);
150
151 ASSERT_FALSE(stored.is_contiguous());
152
153 std::stringbuf buffer;
154 std::iostream stream(&buffer);
155 dataStore(stream, stored, nullptr);
156
157 torch::Tensor loaded;
158 dataLoad(stream, loaded, nullptr);
159
160 ASSERT_EQ(loaded.size(0), stored.size(0));
161 ASSERT_EQ(loaded.size(1), stored.size(1));
162 EXPECT_TRUE(torch::allclose(loaded, stored));
163}
164
165TEST(StochasticTools, standardizerDataStoreLoad)
166{
167 torch::Tensor input_tensor =
168 torch::tensor({{3.0, 1.0}, {5.0, -1.0}, {7.0, 3.0}}, {torch::kFloat64});
169
171 stored.computeSet(input_tensor);
172
173 std::stringbuf buffer;
174 std::iostream stream(&buffer);
175 dataStore(stream, stored, nullptr);
176
178 dataLoad(stream, loaded, nullptr);
179
180 EXPECT_TRUE(torch::allclose(loaded.getMean(), stored.getMean()));
181 EXPECT_TRUE(torch::allclose(loaded.getStdDev(), stored.getStdDev()));
182}
183
184TEST(StochasticTools, standardizerEmptyDataStoreLoad)
185{
187 std::stringbuf buffer;
188 std::iostream stream(&buffer);
189 dataStore(stream, stored, nullptr);
191 dataLoad(stream, loaded, nullptr);
192}
193
194#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.