GCC Code Coverage Report


Directory: ./
File: unit_tests/test_basic_math/test_interpolation_3d.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 70 0 70
Functions: 100.0% 5 0 5
Branches: 41.4% 111 0 268
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 /*
2 * @file test_interpolation_3d.cpp
3 *
4 * Created on: Oct 17, 2013
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8 #include "pch.h"
9
10 #include <stdlib.h>
11
12 #include "efi_interpolation.h"
13
14 #define RPM_COUNT 5
15 #define VALUE_COUNT 4
16
17 float rpmBins[RPM_COUNT] = { 100, 200, 300, 400, 500 };
18 scaled_channel<uint8_t, 1, 50> rpmBinsScaledByte[5] = { 100, 200, 300, 400, 500};
19
20 float mafBins[VALUE_COUNT] = { 1, 2, 3, 4 };
21 scaled_channel<int, 10> mafBinsScaledInt[VALUE_COUNT] = { 1, 2, 3, 4 };
22 scaled_channel<uint8_t, 10> mafBinsScaledByte[VALUE_COUNT] = { 1, 2, 3, 4 };
23
24 scaled_channel<uint32_t, 10000, 3> mapScaledChannel[VALUE_COUNT][RPM_COUNT] = {
25 { 1, 2, 3, 4, 4},
26 { 2, 3, 4, 200, 200 },
27 { 3, 4, 200, 500, 500 },
28 { 4, 5, 300, 600, 600 },
29 };
30
31 float map[VALUE_COUNT][RPM_COUNT] = {
32 { 1, 2, 3, 4, 4},
33 { 2, 3, 4, 200, 200 },
34 { 3, 4, 200, 500, 500 },
35 { 4, 5, 300, 600, 600 },
36 };
37
38 30 static float getValue(float rpm, float maf) {
39 30 Map3D<RPM_COUNT, VALUE_COUNT, float, float, float> x1{"x"};
40 // note "5, 4" above
41 // note "map[4][5], Bins[4], rpm[5] below
42
1/1
✓ Branch 1 taken 30 times.
30 x1.initTable(map, rpmBins, mafBins);
43
1/1
✓ Branch 1 taken 30 times.
30 float result1 = x1.getValue(rpm, maf);
44
45
46 30 Map3D<RPM_COUNT, VALUE_COUNT, float, float, int> x2{"x"};
47
1/1
✓ Branch 1 taken 30 times.
30 x2.initTable(map, rpmBins, mafBinsScaledInt);
48
1/1
✓ Branch 1 taken 30 times.
30 float result2 = x2.getValue(rpm, maf);
49
2/6
✓ Branch 2 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 30 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
30 EXPECT_NEAR_M4(result1, result2);
50
51
52 30 Map3D<RPM_COUNT, VALUE_COUNT, float, float, uint8_t> x3{"x"};
53
1/1
✓ Branch 1 taken 30 times.
30 x3.initTable(map, rpmBins, mafBinsScaledByte);
54
1/1
✓ Branch 1 taken 30 times.
30 float result3 = x3.getValue(rpm, maf);
55
2/6
✓ Branch 2 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 30 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
30 EXPECT_NEAR_M4(result1, result3);
56
57 30 Map3D<RPM_COUNT, VALUE_COUNT, float, uint8_t, float> x4{"x"};
58
1/1
✓ Branch 1 taken 30 times.
30 x4.initTable(map, rpmBinsScaledByte, mafBins);
59
1/1
✓ Branch 1 taken 30 times.
30 float result4 = x4.getValue(rpm, maf);
60
2/6
✓ Branch 2 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 30 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
30 EXPECT_NEAR_M4(result1, result4);
61
62
1/1
✓ Branch 1 taken 30 times.
30 float result5 = interpolate3d(
63 map,
64 mafBinsScaledInt, maf,
65 rpmBinsScaledByte, rpm
66 );
67
2/6
✓ Branch 2 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 30 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
30 EXPECT_NEAR_M4(result1, result5);
68
69 // Test with values stored in scaled bytes
70 30 Map3D<RPM_COUNT, VALUE_COUNT, uint32_t, float, float> x6{"x"};
71
1/1
✓ Branch 1 taken 30 times.
30 x6.initTable(mapScaledChannel, rpmBins, mafBins);
72
1/1
✓ Branch 1 taken 30 times.
30 float result6 = x6.getValue(rpm, maf);
73
2/6
✓ Branch 2 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 30 times.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
30 EXPECT_NEAR(result1, result6, 1e-3);
74
75 60 return result1;
76 }
77
78 1 static void newTestToComfirmInterpolation() {
79 // here's how the table loos like:
80 //
81 //__RPM_
82 //__300_|_10|200|
83 //__200_|__3|__4|
84 //______|__2|__3|_LOAD
85
86 1 map[1][2] = 10;
87 1 mapScaledChannel[1][2] = 10;
88
89
90 // let's start by testing corners
91
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(3, getValue(/*rpm*/200, 2));
92
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(4, getValue(/*rpm*/200, 3)) << "low rpm high load";
93
94
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(10, getValue(/*rpm*/300, 2));
95
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(200, getValue(/*rpm*/300, 3));
96
97 // now testing middles of cell sides
98
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(3.5, getValue(/*rpm*/200, 2.5)) << "low rpm middle";
99
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(105, getValue(/*rpm*/300, 2.5)) << "high rpm";
100
101
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(6.5, getValue(/*rpm*/250, 2)) << "low load middle";
102
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(102, getValue(/*rpm*/250, 3));
103
104 // slowly go from middle side towards center
105
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(16.05, getValue(/*rpm*/250, 2.1)) << "middle @ 2.1";
106
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(25.6, getValue(/*rpm*/250, 2.2)) << "middle @ 2.2";
107
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(35.15, getValue(/*rpm*/250, 2.3)) << "middle @ 2.3";
108
109
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(54.25, getValue(/*rpm*/250, 2.5)) << "middle cell";
110
111 // issue #604: interpolation outside of the table
112 // X above the range
113
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(230, getValue(/*rpm*/800, 2.1)) << "800 @ 2.1";
114
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(290, getValue(/*rpm*/800, 2.3)) << "800 @ 2.3";
115
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(530, getValue(/*rpm*/800, 3.3)) << "800 @ 3.3";
116
117 // X below the range
118
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(2.1, getValue(/*rpm*/-810, 2.1)) << "-810 @ 2.1";
119
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(2.3, getValue(/*rpm*/-820, 2.3)) << "-820 @ 2.3";
120
121 // Y above the range
122
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(330, getValue(/*rpm*/310, 12.1)) << "310 @ 12.1";
123
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(360, getValue(/*rpm*/320, 12.3)) << "320 @ 12.3";
124
125 // Y below the range
126
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(3.1, getValue(/*rpm*/310, -12.1)) << "310 @ -12.1";
127
3/8
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
1 EXPECT_NEAR_M4(3.2, getValue(/*rpm*/320, -12.3)) << "320 @ -12.3";
128 1 }
129
130 4 TEST(misc, testInterpolate3d) {
131 1 printf("*** no interpolation here 1\r\n");
132
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(2, getValue(100, 2));
133
134 1 printf("*** no interpolation here 2\r\n");
135
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(5, getValue(200, 4));
136
137 1 printf("*** rpm interpolated value expected1\r\n");
138
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(2.5, getValue(150, 2));
139
140 1 printf("*** rpm interpolated value expected2\r\n");
141
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(102, getValue(250, 3));
142
143 1 printf("*** both rpm and maf interpolated value expected\r\n");
144
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(361, getValue(335.3, 3.551));
145
146 1 printf("*** both rpm and maf interpolated value expected 2\r\n");
147
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(203.6, getValue(410.01, 2.012));
148
149 1 printf("*** both rpm and maf interpolated value expected 3\r\n");
150
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(600, getValue(1000000, 1000));
151
152 1 printf("*** both rpm and maf interpolated value expected 4\r\n");
153
154
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(4, getValue(410.01, -1));
155
156
157
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR_M4(1, getValue(-1, -1));
158
159 1 newTestToComfirmInterpolation();
160 1 }
161