INLA_DIST
Loading...
Searching...
No Matches
generate_testMat_selInv.cpp
1// generate test matrices BTA block inversion
2
3#include <random>
4#include <vector>
5#include <iostream>
6#include <fstream>
7#include <math.h>
8#include <time.h>
9#include <stdlib.h>
10#include <stdio.h>
11
12#include <Eigen/Core>
13#include <Eigen/Dense>
14#include <Eigen/Sparse>
15#include <unsupported/Eigen/KroneckerProduct>
16
17using Eigen::MatrixXd;
18
19typedef Eigen::SparseMatrix<double> SpMat; // declares a column-major sparse matrix type of double
20typedef Eigen::VectorXd Vect;
21
22
23// hardcode very simple test case
24SpMat gen_test_mat_base1(){
25 SpMat Q(5,5);
26 int n = Q.cols();
27
28 Vect d(5);
29 Vect offD(3);
30 Vect denseD(4);
31
32 d << 2,4,7,4,5;
33 offD << -0.2, -0.05, -0.1;
34 denseD << -0.4, -0.3, -0.2, -0.1;
35
36 std::cout << "d = " << d.transpose() << std::endl;
37 std::cout << "offD = " << offD.transpose() << std::endl;
38 std::cout << "denseD = " << denseD.transpose() << std::endl;
39
40
41 // insert elements
42 for(int i=0; i<n; i++){
43 Q.insert(i, i) = d[i];
44
45 if(i < n-1){
46 Q.insert(n-1, i)= denseD[i];
47 Q.insert(i, n-1)= denseD[i];
48 }
49
50 if(i < n-2){
51 Q.insert(i,i+1) = offD[i];
52 Q.insert(i+1,i) = offD[i];
53 }
54
55 }
56
57 Q.makeCompressed();
58 return Q;
59}
60
61
62SpMat gen_test_mat_base2(){
63 SpMat Q(7,7);
64 int n = Q.cols();
65
66 Vect d(7);
67 Vect offD(5);
68 Vect denseD(6);
69
70 d << 8,2,4,7,4,5,11;
71 offD << -0.8, -0.3, -0.2, -0.05, -0.1;
72 denseD << -0.2, -0.5, -0.4, -0.3, -0.2, -0.1;
73
74 std::cout << "d = " << d.transpose() << std::endl;
75 std::cout << "offD = " << offD.transpose() << std::endl;
76 std::cout << "denseD = " << denseD.transpose() << std::endl;
77
78
79 // insert elements
80 for(int i=0; i<n; i++){
81 Q.insert(i, i) = d[i];
82
83 if(i < n-1){
84 Q.insert(n-1, i)= denseD[i];
85 Q.insert(i, n-1)= denseD[i];
86 }
87
88 if(i < n-2){
89 Q.insert(i,i+1) = offD[i];
90 Q.insert(i+1,i) = offD[i];
91 }
92
93 }
94
95 Q.makeCompressed();
96 return Q;
97}
98
99SpMat gen_test_mat_base3(int ns, int nt, int nb){
100
101 //int nb = 2;
102 int n = ns*nt + nb;
103 MatrixXd Q_d(n,n);
104 Q_d.setZero();
105
106 MatrixXd A1(ns, ns);
107 MatrixXd A2(ns, ns);
108
109 if(ns == 2){
110 A1 << 10, -1,
111 -1, 10;
112
113 A2 << -0.5, -0.5,
114 -0.5, -0.5;
115 } else if(ns == 3){
116
117 A1 << 10, -1, -0.5,
118 -1, 10, -1,
119 -0.5, -1, 10;
120
121 A2 << -0.5, -0.5, -0.5,
122 -0.5, -0.5, -0.5,
123 -0.5, -0.5, -0.5;
124 } else {
125 printf("Invalid choice ns. Valid choices are 2 & 3.\n");
126 exit(1);
127 }
128
129
130 SpMat Q_upper(ns*nt, ns*nt);
131
132 for(int i=0; i<nt; i++){
133 int ii = i*ns;
134 //printf("ii = %d, ii+ns = %d\n", ii,ii+ns);
135 Q_d.block(ii,ii,ns,ns) = A1;
136 if(i < nt-1){
137 Q_d.block(ii,ii+ns, ns, ns) = A2;
138 Q_d.block(ii+ns,ii, ns, ns) = A2.transpose();
139 }
140 }
141
142 MatrixXd A3 = 0.5*(MatrixXd::Random(nb, ns*nt) - MatrixXd::Ones(nb, ns*nt));
143 Q_d.block(ns*nt,0,nb,ns*nt) = A3;
144 Q_d.block(0,ns*nt,ns*nt,nb) = A3.transpose();
145
146 MatrixXd A4(nb,nb);
147
148 if(nb == 1){
149 A4 << n;
150 } else if(nb ==2) {
151 A4 << n, -0.5,
152 -0.5, n;
153 } else if (nb == 3){
154 A4 << n, 0, 0,
155 0, n, 0,
156 0, 0, n;
157 } else {
158 printf("invalid size nb, admissible choices: 1,2 & 3.!\n");
159 }
160
161 Q_d.block(ns*nt, ns*nt, nb, nb) = A4;
162
163
164 std::cout << "Q :\n" << Q_d << std::endl;
165
166
167 SpMat Q = Q_d.sparseView();
168
169
170 return Q;
171
172
173
174}