LCOV - code coverage report
Current view: top level - elsa/projectors/tests - test_Luts.cpp (source / functions) Hit Total Coverage
Test: coverage-all.lcov Lines: 204 204 100.0 %
Date: 2023-01-26 04:22:16 Functions: 8 8 100.0 %

          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();

Generated by: LCOV version 1.14