annotate tests/TestMathUtilities.cpp @ 209:ccd2019190bf msvc

Some MSVC fixes, including (temporarily, probably) renaming the FFT source file to avoid getting it mixed up with the Vamp SDK one in our object dir
author Chris Cannam
date Thu, 01 Feb 2018 16:34:08 +0000
parents 26daede606a8
children
rev   line source
Chris@123 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@123 2
Chris@123 3 #include "maths/MathUtilities.h"
Chris@123 4
Chris@123 5 #include <cmath>
Chris@194 6 #include <iostream>
Chris@123 7
Chris@123 8 #define BOOST_TEST_DYN_LINK
Chris@123 9 #define BOOST_TEST_MAIN
Chris@123 10
Chris@123 11 #include <boost/test/unit_test.hpp>
Chris@123 12
Chris@194 13 using namespace std;
Chris@194 14
Chris@123 15 BOOST_AUTO_TEST_SUITE(TestMathUtilities)
Chris@123 16
Chris@123 17 BOOST_AUTO_TEST_CASE(round)
Chris@123 18 {
Chris@123 19 BOOST_CHECK_EQUAL(MathUtilities::round(0.5), 1.0);
Chris@123 20 BOOST_CHECK_EQUAL(MathUtilities::round(0.49), 0.0);
Chris@123 21 BOOST_CHECK_EQUAL(MathUtilities::round(0.99), 1.0);
Chris@123 22 BOOST_CHECK_EQUAL(MathUtilities::round(0.01), 0.0);
Chris@123 23 BOOST_CHECK_EQUAL(MathUtilities::round(0.0), 0.0);
Chris@123 24 BOOST_CHECK_EQUAL(MathUtilities::round(100.0), 100.0);
Chris@123 25 BOOST_CHECK_EQUAL(MathUtilities::round(-0.2), 0.0);
Chris@123 26 BOOST_CHECK_EQUAL(MathUtilities::round(-0.5), -1.0);
Chris@123 27 BOOST_CHECK_EQUAL(MathUtilities::round(-0.99), -1.0);
Chris@123 28 BOOST_CHECK_EQUAL(MathUtilities::round(-1.0), -1.0);
Chris@123 29 BOOST_CHECK_EQUAL(MathUtilities::round(-1.1), -1.0);
Chris@123 30 BOOST_CHECK_EQUAL(MathUtilities::round(-1.5), -2.0);
Chris@123 31 }
Chris@123 32
Chris@123 33 BOOST_AUTO_TEST_CASE(mean)
Chris@123 34 {
Chris@123 35 BOOST_CHECK_EQUAL(MathUtilities::mean(0, 0), 0);
Chris@123 36 double d0[] = { 0, 4, 3, -1 };
Chris@123 37 BOOST_CHECK_EQUAL(MathUtilities::mean(d0, 4), 1.5);
Chris@123 38 double d1[] = { -2.6 };
Chris@123 39 BOOST_CHECK_EQUAL(MathUtilities::mean(d1, 1), -2.6);
Chris@194 40 vector<double> v;
Chris@123 41 v.push_back(0);
Chris@123 42 v.push_back(4);
Chris@123 43 v.push_back(3);
Chris@123 44 v.push_back(-1);
Chris@123 45 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 0, 4), 1.5);
Chris@123 46 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 1, 2), 3.5);
Chris@123 47 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 3, 1), -1);
Chris@123 48 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 3, 0), 0);
Chris@123 49 }
Chris@123 50
Chris@123 51 BOOST_AUTO_TEST_CASE(sum)
Chris@123 52 {
Chris@123 53 BOOST_CHECK_EQUAL(MathUtilities::sum(0, 0), 0);
Chris@123 54 double d0[] = { 0, 4, 3, -1 };
Chris@123 55 BOOST_CHECK_EQUAL(MathUtilities::sum(d0, 4), 6);
Chris@123 56 double d1[] = { -2.6 };
Chris@123 57 BOOST_CHECK_EQUAL(MathUtilities::sum(d1, 1), -2.6);
Chris@123 58 }
Chris@123 59
Chris@123 60 BOOST_AUTO_TEST_CASE(median)
Chris@123 61 {
Chris@123 62 BOOST_CHECK_EQUAL(MathUtilities::median(0, 0), 0);
Chris@123 63 double d0[] = { 0, 4, 3, -1 };
Chris@123 64 BOOST_CHECK_EQUAL(MathUtilities::median(d0, 4), 1.5);
Chris@123 65 double d1[] = { 0, 4, 3, -1, -1 };
Chris@123 66 BOOST_CHECK_EQUAL(MathUtilities::median(d1, 5), 0);
Chris@123 67 double d2[] = { 1.0, -2.0 };
Chris@123 68 BOOST_CHECK_EQUAL(MathUtilities::median(d2, 2), -0.5);
Chris@123 69 double d3[] = { -2.6 };
Chris@123 70 BOOST_CHECK_EQUAL(MathUtilities::median(d3, 1), -2.6);
Chris@123 71 }
Chris@123 72
Chris@123 73 BOOST_AUTO_TEST_CASE(princarg)
Chris@123 74 {
Chris@123 75 BOOST_CHECK_EQUAL(MathUtilities::princarg(M_PI), M_PI);
Chris@123 76 BOOST_CHECK_EQUAL(MathUtilities::princarg(-M_PI), M_PI);
Chris@123 77 BOOST_CHECK_EQUAL(MathUtilities::princarg(2 * M_PI), 0.0);
Chris@123 78 BOOST_CHECK_EQUAL(MathUtilities::princarg(5 * M_PI), M_PI);
Chris@123 79 BOOST_CHECK_EQUAL(MathUtilities::princarg(1.0), 1.0);
Chris@123 80 BOOST_CHECK_EQUAL(MathUtilities::princarg(-1.0), -1.0);
Chris@123 81 BOOST_CHECK_EQUAL(MathUtilities::princarg(-10.0), -10.0 + 4 * M_PI);
Chris@123 82 }
Chris@123 83
Chris@123 84 BOOST_AUTO_TEST_CASE(isPowerOfTwo)
Chris@123 85 {
Chris@123 86 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(0), false);
Chris@123 87 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(1), true);
Chris@123 88 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(-2), false);
Chris@123 89 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(2), true);
Chris@123 90 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(3), false);
Chris@123 91 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(12), false);
Chris@123 92 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(16), true);
Chris@123 93 }
Chris@123 94
Chris@123 95 BOOST_AUTO_TEST_CASE(nextPowerOfTwo)
Chris@123 96 {
Chris@123 97 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(0), 1);
Chris@123 98 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(1), 1);
Chris@123 99 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(-2), 1);
Chris@123 100 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(2), 2);
Chris@123 101 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(3), 4);
Chris@123 102 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(12), 16);
Chris@123 103 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(16), 16);
Chris@123 104 }
Chris@123 105
Chris@123 106 BOOST_AUTO_TEST_CASE(previousPowerOfTwo)
Chris@123 107 {
Chris@123 108 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(0), 1);
Chris@123 109 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(1), 1);
Chris@123 110 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(-2), 1);
Chris@123 111 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(2), 2);
Chris@123 112 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(3), 2);
Chris@123 113 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(12), 8);
Chris@123 114 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(16), 16);
Chris@123 115 }
Chris@123 116
Chris@123 117 BOOST_AUTO_TEST_CASE(nearestPowerOfTwo)
Chris@123 118 {
Chris@123 119 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(0), 1);
Chris@123 120 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(1), 1);
Chris@123 121 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(-2), 1);
Chris@123 122 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(2), 2);
Chris@123 123 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(3), 4);
Chris@123 124 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(11), 8);
Chris@123 125 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(12), 16);
Chris@123 126 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(16), 16);
Chris@123 127 }
Chris@123 128
Chris@123 129 BOOST_AUTO_TEST_CASE(factorial)
Chris@123 130 {
Chris@135 131 BOOST_CHECK_EQUAL(MathUtilities::factorial(-10), 0.0);
Chris@135 132 BOOST_CHECK_EQUAL(MathUtilities::factorial(0), 1.0);
Chris@135 133 BOOST_CHECK_EQUAL(MathUtilities::factorial(1), 1.0);
Chris@135 134 BOOST_CHECK_EQUAL(MathUtilities::factorial(2), 2.0);
Chris@135 135 BOOST_CHECK_EQUAL(MathUtilities::factorial(3), 6.0);
Chris@135 136 BOOST_CHECK_EQUAL(MathUtilities::factorial(4), 24.0);
Chris@135 137
Chris@135 138 // Too big for an int, hence double return value from factorial
Chris@135 139 BOOST_CHECK_EQUAL(MathUtilities::factorial(20), 2432902008176640000.0);
Chris@123 140 }
Chris@123 141
Chris@125 142 BOOST_AUTO_TEST_CASE(gcd)
Chris@125 143 {
Chris@125 144 BOOST_CHECK_EQUAL(MathUtilities::gcd(1, 1), 1);
Chris@125 145 BOOST_CHECK_EQUAL(MathUtilities::gcd(2, 1), 1);
Chris@125 146 BOOST_CHECK_EQUAL(MathUtilities::gcd(2, 3), 1);
Chris@125 147 BOOST_CHECK_EQUAL(MathUtilities::gcd(4, 2), 2);
Chris@125 148 BOOST_CHECK_EQUAL(MathUtilities::gcd(18, 24), 6);
Chris@125 149 BOOST_CHECK_EQUAL(MathUtilities::gcd(27, 18), 9);
Chris@125 150 BOOST_CHECK_EQUAL(MathUtilities::gcd(18, 36), 18);
Chris@125 151 BOOST_CHECK_EQUAL(MathUtilities::gcd(37, 18), 1);
Chris@125 152 }
Chris@125 153
Chris@194 154 BOOST_AUTO_TEST_CASE(getAlphaNorm1)
Chris@194 155 {
Chris@194 156 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 157 double out = MathUtilities::getAlphaNorm(in, 1);
Chris@194 158 double expected = 2.6250;
Chris@194 159 double thresh = 1e-4;
Chris@194 160 BOOST_CHECK_SMALL(out - expected, thresh);
Chris@194 161 }
Chris@194 162
Chris@194 163 BOOST_AUTO_TEST_CASE(getAlphaNorm2)
Chris@194 164 {
Chris@194 165 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 166 double out = MathUtilities::getAlphaNorm(in, 2);
Chris@194 167 double expected = 3.0516;
Chris@194 168 double thresh = 1e-4;
Chris@194 169 BOOST_CHECK_SMALL(out - expected, thresh);
Chris@194 170 }
Chris@194 171
Chris@194 172 BOOST_AUTO_TEST_CASE(getL1Norm)
Chris@194 173 {
Chris@194 174 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 175 double out = MathUtilities::getLpNorm(in, 1);
Chris@194 176 // L1 norm is the sum of magnitudes
Chris@194 177 double expected = 10.5;
Chris@194 178 double thresh = 1e-5;
Chris@194 179 BOOST_CHECK_SMALL(out - expected, thresh);
Chris@194 180 }
Chris@194 181
Chris@194 182 BOOST_AUTO_TEST_CASE(getL2Norm)
Chris@194 183 {
Chris@194 184 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 185 double out = MathUtilities::getLpNorm(in, 2);
Chris@194 186 // L2 norm is the sqrt of sum of squared magnitudes
Chris@194 187 double expected = sqrt(37.25);
Chris@194 188 double thresh = 1e-5;
Chris@194 189 BOOST_CHECK_SMALL(out - expected, thresh);
Chris@194 190 }
Chris@194 191
Chris@194 192 BOOST_AUTO_TEST_CASE(getL3Norm)
Chris@194 193 {
Chris@194 194 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 195 double out = MathUtilities::getLpNorm(in, 3);
Chris@194 196 double expected = 5.3875;
Chris@194 197 double thresh = 1e-4;
Chris@194 198 BOOST_CHECK_SMALL(out - expected, thresh);
Chris@194 199 }
Chris@194 200
Chris@194 201 BOOST_AUTO_TEST_CASE(normaliseL1)
Chris@194 202 {
Chris@194 203 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 204 vector<double> expected { -0.095238, 0.142857, 0.285714, 0.476190 };
Chris@194 205 vector<double> out = MathUtilities::normaliseLp(in, 1);
Chris@194 206 double thresh = 1e-5;
Chris@194 207 for (int i = 0; i < int(out.size()); ++i) {
Chris@194 208 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
Chris@194 209 }
Chris@194 210 out = MathUtilities::normaliseLp({ 0, 0, 0, 0 }, 1);
Chris@194 211 for (int i = 0; i < int(out.size()); ++i) {
Chris@194 212 BOOST_CHECK_EQUAL(out[i], 0.25);
Chris@194 213 }
Chris@194 214 }
Chris@194 215
Chris@194 216 BOOST_AUTO_TEST_CASE(normaliseL2)
Chris@194 217 {
Chris@194 218 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 219 vector<double> expected { -0.16385, 0.24577, 0.49154, 0.81923 };
Chris@194 220 vector<double> out = MathUtilities::normaliseLp(in, 2);
Chris@194 221 double thresh = 1e-5;
Chris@194 222 for (int i = 0; i < int(out.size()); ++i) {
Chris@194 223 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
Chris@194 224 }
Chris@194 225 out = MathUtilities::normaliseLp({ 0, 0, 0, 0 }, 2);
Chris@194 226 for (int i = 0; i < int(out.size()); ++i) {
Chris@194 227 BOOST_CHECK_EQUAL(out[i], 0.5);
Chris@194 228 }
Chris@194 229 }
Chris@194 230
Chris@194 231 BOOST_AUTO_TEST_CASE(normaliseL3)
Chris@194 232 {
Chris@194 233 vector<double> in { -1, 1.5, 3, 5 };
Chris@194 234 vector<double> expected { -0.18561, 0.27842, 0.55684, 0.92807 };
Chris@194 235 vector<double> out = MathUtilities::normaliseLp(in, 3);
Chris@194 236 double thresh = 1e-5;
Chris@194 237 for (int i = 0; i < int(out.size()); ++i) {
Chris@194 238 BOOST_CHECK_SMALL(out[i] - expected[i], thresh);
Chris@194 239 }
Chris@194 240 out = MathUtilities::normaliseLp({ 0, 0, 0, 0 }, 3);
Chris@194 241 for (int i = 0; i < int(out.size()); ++i) {
Chris@194 242 BOOST_CHECK_SMALL(out[i] - 0.62996, 1e-5);
Chris@194 243 }
Chris@194 244 }
Chris@194 245
Chris@123 246 BOOST_AUTO_TEST_SUITE_END()
Chris@123 247
Chris@123 248