Line data Source code
1 : #include "doctest/doctest.h"
2 :
3 : #include "Luts.hpp"
4 : #include <algorithm>
5 : #include <numeric>
6 :
7 : using namespace elsa;
8 : using namespace doctest;
9 :
10 : TEST_SUITE_BEGIN("projectors");
11 :
12 : TEST_CASE_TEMPLATE("Lut: Testing Lut with an array of ones", data_t, float, double)
13 4 : {
14 4 : constexpr index_t size = 100;
15 :
16 4 : std::array<data_t, size> array;
17 4 : std::fill(std::begin(array), std::end(array), 1);
18 :
19 4 : Lut lut(array);
20 :
21 4 : WHEN("Accessing with at integer values")
22 4 : {
23 202 : for (index_t i = 0; i < size; ++i) {
24 200 : CHECK_EQ(lut(i), 1);
25 200 : }
26 2 : }
27 :
28 4 : WHEN("Accessing with at midpoint values")
29 4 : {
30 200 : for (index_t i = 0; i < size - 1; ++i) {
31 198 : CAPTURE(i + 0.5);
32 198 : CHECK_EQ(lut(i + 0.5), 1);
33 198 : }
34 2 : }
35 4 : }
36 :
37 : TEST_CASE_TEMPLATE("Lut: Testing Lut with integer sequence", data_t, float, double)
38 10 : {
39 10 : constexpr index_t size = 100;
40 :
41 10 : std::array<data_t, size> array;
42 10 : std::iota(std::begin(array), std::end(array), 0);
43 :
44 10 : Lut lut(array);
45 :
46 10 : WHEN("Accessing with at integer values")
47 10 : {
48 202 : for (index_t i = 0; i < size; ++i) {
49 200 : CHECK_EQ(lut(i), i);
50 200 : }
51 2 : }
52 :
53 10 : WHEN("Accessing with at midpoint values")
54 10 : {
55 200 : for (index_t i = 0; i < size - 1; ++i) {
56 198 : CAPTURE(i);
57 198 : CAPTURE(lut(i));
58 198 : CAPTURE(lut(i + 1));
59 198 : CHECK_EQ(lut(i + 0.5), i + 0.5);
60 198 : }
61 2 : }
62 :
63 10 : WHEN("Accessing with points 1/4 along the way")
64 10 : {
65 200 : for (index_t i = 0; i < size - 1; ++i) {
66 198 : CAPTURE(i);
67 198 : CAPTURE(lut(i));
68 198 : CAPTURE(lut(i + 1));
69 198 : CHECK_EQ(lut(i + 0.25), i + 0.25);
70 198 : }
71 2 : }
72 :
73 10 : WHEN("Accessing with points 1/3 along the way")
74 10 : {
75 200 : for (index_t i = 0; i < size - 1; ++i) {
76 198 : CAPTURE(i);
77 198 : CAPTURE(lut(i));
78 198 : CAPTURE(lut(i + 1));
79 198 : CHECK_EQ(Approx(lut(i + 0.33)), i + 0.33);
80 198 : }
81 2 : }
82 :
83 10 : WHEN("Accessing with points 3/4 along the way")
84 10 : {
85 200 : for (index_t i = 0; i < size - 1; ++i) {
86 198 : CAPTURE(i);
87 198 : CAPTURE(lut(i));
88 198 : CAPTURE(lut(i + 1));
89 198 : CHECK_EQ(lut(i + 0.75), i + 0.75);
90 198 : }
91 2 : }
92 10 : }
93 :
94 : // Redefine GIVEN such that it's nicely usable inside an loop
95 : #undef GIVEN
96 128 : #define GIVEN(...) DOCTEST_SUBCASE((std::string(" Given: ") + std::string(__VA_ARGS__)).c_str())
97 :
98 : TEST_CASE_TEMPLATE("ProjectedBSlineLut: testing with various degrees", data_t, float, double)
99 16 : {
100 80 : for (int degree = 0; degree < 4; ++degree) {
101 192 : for (int dim = 2; dim < 4; ++dim) {
102 128 : GIVEN("BSpline Lut of degree " + std::to_string(degree)
103 128 : + " with dim: " + std::to_string(dim))
104 128 : {
105 16 : ProjectedBSplineLut<data_t, 50> lut(dim, degree);
106 16 : ProjectedBSpline<data_t> proj_blob(dim, degree);
107 :
108 1616 : for (int i = 0; i < 100; ++i) {
109 1600 : const auto distance = i / 25.;
110 :
111 1600 : CAPTURE(i);
112 1600 : CAPTURE(distance);
113 1600 : CAPTURE(lut(distance));
114 :
115 1600 : CHECK_EQ(lut(distance), Approx(proj_blob(distance)));
116 1600 : CHECK_EQ(lut(-distance), Approx(proj_blob(-distance)));
117 1600 : }
118 16 : }
119 128 : }
120 64 : }
121 16 : }
122 :
123 : TEST_CASE_TEMPLATE("ProjectedBlobLut: ", data_t, float, double)
124 2 : {
125 2 : const auto a = 2;
126 2 : const auto alpha = 10.83;
127 2 : const auto m = 2;
128 :
129 2 : std::array<double, 101> expected{1.3671064952680276,
130 2 : 1.366209140520679,
131 2 : 1.3635202864368146,
132 2 : 1.3590495461221548,
133 2 : 1.3528128836429958,
134 2 : 1.344832527778225,
135 2 : 1.3351368521026497,
136 2 : 1.323760222223995,
137 2 : 1.3107428112196733,
138 2 : 1.296130384534639,
139 2 : 1.2799740558068384,
140 2 : 1.2623300152802015,
141 2 : 1.2432592326454344,
142 2 : 1.2228271363144718,
143 2 : 1.2011032712842662,
144 2 : 1.178160937878318,
145 2 : 1.1540768137691881,
146 2 : 1.12893056178116,
147 2 : 1.1028044260488254,
148 2 : 1.0757828191638883,
149 2 : 1.0479519029788988,
150 2 : 1.0193991657525119,
151 2 : 0.9902129983165086,
152 2 : 0.9604822719203052,
153 2 : 0.930295920364307,
154 2 : 0.8997425289700537,
155 2 : 0.868909932853028,
156 2 : 0.8378848268644085,
157 2 : 0.80675238945173,
158 2 : 0.7755959225566695,
159 2 : 0.7444965095220905,
160 2 : 0.7135326928216648,
161 2 : 0.6827801732549599,
162 2 : 0.6523115320707827,
163 2 : 0.6221959772930218,
164 2 : 0.5924991153282746,
165 2 : 0.5632827487344612,
166 2 : 0.5346047008265601,
167 2 : 0.5065186675909519,
168 2 : 0.47907409717543664,
169 2 : 0.4523160970195944,
170 2 : 0.426285368491199,
171 2 : 0.40101816870068707,
172 2 : 0.37654629897855096,
173 2 : 0.35289711932154216,
174 2 : 0.33009358794397464,
175 2 : 0.30815432491147815,
176 2 : 0.28709369868739343,
177 2 : 0.2669219342875695,
178 2 : 0.24764524161852372,
179 2 : 0.22926596246745282,
180 2 : 0.2117827345210135,
181 2 : 0.1951906707135796,
182 2 : 0.1794815521451009,
183 2 : 0.1646440327638897,
184 2 : 0.15066385398062748,
185 2 : 0.13752406736650655,
186 2 : 0.12520526359037534,
187 2 : 0.11368580576665363,
188 2 : 0.1029420654170972,
189 2 : 0.09294865929450916,
190 2 : 0.08367868537452354,
191 2 : 0.0751039563916854,
192 2 : 0.0671952293773174,
193 2 : 0.05992242974801804,
194 2 : 0.053254868594009144,
195 2 : 0.04716145192475515,
196 2 : 0.04161088074412672,
197 2 : 0.036571840947646775,
198 2 : 0.03201318215877265,
199 2 : 0.027904084748497336,
200 2 : 0.024214214411544636,
201 2 : 0.020913863801848218,
202 2 : 0.017974080858669254,
203 2 : 0.015366783581446854,
204 2 : 0.013064861135202048,
205 2 : 0.01104226128798172,
206 2 : 0.009274064296470727,
207 2 : 0.007736543464620423,
208 2 : 0.006407212702138576,
209 2 : 0.005264861504239613,
210 2 : 0.004289577860543678,
211 2 : 0.003462759678911652,
212 2 : 0.0027671153788854513,
213 2 : 0.0021866543689359847,
214 2 : 0.0017066681716703673,
215 2 : 0.0013137030013652602,
216 2 : 0.000995524628597278,
217 2 : 0.0007410763873099119,
218 2 : 0.0005404311903714976,
219 2 : 0.0003847384204545552,
220 2 : 0.0002661665535932496,
221 2 : 0.0001778423521946198,
222 2 : 0.00011378743045824658,
223 2 : 6.885294293780879e-05,
224 2 : 3.865306353687595e-05,
225 2 : 1.9497773431607567e-05,
226 2 : 8.325160241062897e-06,
227 2 : 2.632583006403572e-06,
228 2 : 4.029329203627377e-07,
229 2 : 0};
230 :
231 2 : ProjectedBlobLut<data_t, 100> lut(a, alpha, m);
232 :
233 2 : CAPTURE(a);
234 2 : CAPTURE(alpha);
235 2 : CAPTURE(m);
236 :
237 200 : for (int i = 0; i < 99; ++i) {
238 198 : const auto distance = i / 50.;
239 :
240 198 : CAPTURE(i);
241 198 : CAPTURE(distance);
242 198 : CHECK_EQ(Approx(lut(distance)).epsilon(0.000001), expected[i]);
243 198 : }
244 2 : }
245 :
246 : TEST_SUITE_END();
|