1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#include <catch.hpp>
#include <iostream>
#include "gsl/gsl_matrix.h"
#include "mathfunc.h"
#include <algorithm>
#include <limits>
#include <numeric>
using namespace std;
TEST_CASE( "Math functions", "[math]" ) {
double data[] = { 2,-1, 0,
-1, 2,-1,
0,-1, 2};
gsl_matrix *m = gsl_matrix_alloc(3,3);
copy(data, data+9, m->data);
REQUIRE( isMatrixPositiveDefinite(m) );
REQUIRE( isMatrixSymmetric(m) );
// REQUIRE( checkMatrixEigen(m,0.001) );
double data1[] = {1.0,0,0,
0,3.0,0,
0,0,2.0};
copy(data1, data1+9, m->data);
REQUIRE( isMatrixPositiveDefinite(m) );
// REQUIRE( checkMatrixEigen(m) );
double data2[] = {1,1,1,
1,1,1,
1,1,0.5};
copy(data2, data2+9, m->data);
REQUIRE( !isMatrixPositiveDefinite(m));
// REQUIRE( !checkMatrixEigen(m) );
double data3[] = {1.0, 0, 0,
3.0,3.0, 0,
0, 0,2.0};
copy(data3, data3+9, m->data);
REQUIRE( !isMatrixPositiveDefinite(m) );
REQUIRE( !isMatrixSymmetric(m) );
// REQUIRE( checkMatrixEigen(m) );
// ---- NaN checks
vector<double> v = {1.0, 2.0};
REQUIRE (!std::isnan(std::accumulate(v.begin(), v.end(), 0)));
vector<double> v2 = {1.0, 2.0, std::numeric_limits<double>::quiet_NaN()};
REQUIRE (std::isnan(v2[2]));
REQUIRE(has_nan(v2));
// test minus nan
vector<double> v3 = {1.0, 2.0, -std::numeric_limits<double>::quiet_NaN()};
REQUIRE (std::isnan(v3[2]));
REQUIRE(has_nan(v3));
}
|