| 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 |