Skip to content

Commit 5f4f0ed

Browse files
author
andre
committed
init final blgrm c++ implementation for public use
0 parents  commit 5f4f0ed

10 files changed

+1775
-0
lines changed

main.cpp

+169
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
/* PX-Bayesian Low-rank Graph Regression Model
2+
* main.cpp
3+
* Eunjuee Lee
4+
*
5+
*/
6+
7+
#include <iostream>
8+
#include <armadillo>
9+
#include "px_blgrm.h"
10+
#include "px_blgrm_helper.h"
11+
#include "mcmc_para.h"
12+
#include "random_generator.h"
13+
14+
15+
16+
using namespace std;
17+
using namespace arma;
18+
19+
20+
int main(int argc, char *argv[]){
21+
22+
try{
23+
24+
mat L_temp; L_temp.load(argv[1], csv_ascii);
25+
mat X; X.load(argv[2], csv_ascii);
26+
27+
string R_in = argv[3];
28+
string V_in = argv[4];
29+
string niter_in = argv[5];
30+
string burnin_in = argv[6];
31+
string slice_niter_in = argv[7];
32+
string slice_burnin_in = argv[8];
33+
34+
int R = stoi(R_in);
35+
int V = stoi(V_in);
36+
int n = X.n_rows; int p = X.n_cols;
37+
38+
// load in L
39+
cube L; L.zeros(V, V, n);
40+
for(int i = 0; i < n; ++i){
41+
L.slice(i) = reshape(L_temp.row(i), V, V);
42+
}
43+
44+
// set parameters
45+
mcmc_para parameters;
46+
parameters.set_niter(stoi(niter_in));
47+
parameters.set_burnin(stoi(burnin_in));
48+
parameters.set_B(V, R);
49+
parameters.set_Lambda(n, R);
50+
parameters.set_Gamma(p, R);
51+
parameters.set_sigma(1);
52+
parameters.set_sig_gam(1);
53+
parameters.set_b1(.01);
54+
parameters.set_b2(.01);
55+
parameters.set_c1(.01);
56+
parameters.set_c2(.01);
57+
parameters.set_va(.5);
58+
parameters.set_vb(.5);
59+
60+
parameters.set_slice_niter(stoi(slice_niter_in));
61+
parameters.set_slice_burnin(stoi(slice_burnin_in));
62+
parameters.set_slice_width(10);
63+
cout << size(L) << "\n";
64+
cout << size(X) << "\n";
65+
66+
px_blgrm(L, X, R, parameters);
67+
}catch(const std::exception& e){
68+
cout << "Error in inputs. Please correct inputs, or uncomment line 164 in main.cpp to run simulation\n";
69+
70+
srand(1); // fix random seed
71+
72+
// initialize all parameters, according to coni3_test.m
73+
int R = 10;
74+
int V = 50;
75+
int n = 100;
76+
int p = 2;
77+
78+
double sigma_0 = 1.0; // Fix variance of Lambda prior for identifiability
79+
80+
mcmc_para parameters;
81+
parameters.set_niter(5500);
82+
parameters.set_B(V, R);
83+
parameters.set_burnin(500);
84+
parameters.set_Lambda(n, R);
85+
86+
87+
parameters.set_Gamma(p, R); // p as in the simulation
88+
// init to defaults
89+
parameters.set_sigma(1);
90+
parameters.set_sig_gam(1);
91+
parameters.set_b1(.01);
92+
parameters.set_b2(.01);
93+
parameters.set_c1(.01);
94+
parameters.set_c2(.01);
95+
parameters.set_va(.5);
96+
parameters.set_vb(.5);
97+
98+
// iterations for metrop/slice
99+
parameters.set_slice_niter(25);
100+
parameters.set_slice_burnin(10);
101+
parameters.set_slice_width(10);
102+
103+
// now simulate data, L and X
104+
double sigma_error = 1.0;
105+
106+
mat B(V, R);
107+
108+
109+
for(int i = 0; i < R; ++i){
110+
B.col(i) = n_norm(V);
111+
}
112+
113+
114+
// simulate data
115+
cube L; L.zeros(V, V, n);
116+
cube tL; tL.zeros(V, V, n);
117+
cube Lambda; Lambda.zeros(R, R, n);
118+
119+
120+
vec x; x = n_norm(n) + 0.5; // init x to 100 std norm, mean .5
121+
122+
mat A; vec temp(R*(R+1)/2); temp = n_norm(R*(R+1)/2);
123+
mat Lamb; Lamb.zeros(R, R);
124+
mat AA; AA.zeros(V, V); vec a;
125+
mat noise; noise.zeros(50, 50);
126+
127+
for(int i = 0; i < n; ++i){
128+
A.zeros(R, R);
129+
vec_2_uptri(A, n_norm(R * (R + 1) / 2) * (1 / sqrt(1)) + 1, R);
130+
A(0, 1) = A(0, 1) + x(i) * 4;
131+
A(1, 2) = A(1, 2) + x(i) * 4;
132+
Lamb = A + A.t() - 2 * diagmat(A.diag());
133+
Lamb.diag() = n_norm(R) + 1; // 3 norm(1,1) RV
134+
135+
Lambda.slice(i) = Lamb;
136+
137+
// need V*(V+1)/2 RB
138+
a = n_norm_musig(V * (V + 1) / 2, 1, sigma_error / sqrt(2));
139+
vec_2_uptri(AA, a, V);
140+
141+
noise = AA + AA.t() - 2 * diagmat(AA.diag());
142+
143+
noise.diag() = n_norm_musig(V, 0, sigma_error);
144+
145+
tL.slice(i) = B * Lambda.slice(i) * B.t();
146+
L.slice(i) = B * Lambda.slice(i) * B.t() + noise;
147+
148+
}
149+
150+
// set up design matrix
151+
mat X; X.ones(n, 2);
152+
X.col(1) = x;
153+
154+
155+
a = n_norm_musig(V * (V + 1) / 2, 1, sigma_error);
156+
157+
// write the actual B, Lambda, for testing
158+
ofstream outf;
159+
outf.open("B_true.txt");
160+
outf << B;
161+
outf.close();
162+
163+
// begin loop and testing helper functions
164+
//px_blgrm(L, X, R, parameters);
165+
166+
}
167+
168+
return 0;
169+
}

make

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
g++ -o px_blgrm main.cpp px_blgrm_helper.cpp mcmc_para.cpp px_blgrm.cpp random_generator.cpp -Werror -O1 -larmadillo -lsuperlu

mcmc_para.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/* PX-Bayesian Low-rank Graph Regression Model
2+
* MCMCpara nested class, for parameter initialization
3+
* Andre
4+
*/
5+
6+
7+
#include <iostream>
8+
#include <armadillo>
9+
#include "mcmc_para.h"
10+
11+
using namespace std;
12+
using namespace arma;
13+
14+
void mcmc_para::set_niter(int input_niter){niter = input_niter;}
15+
int mcmc_para::get_niter(void){return niter;}
16+
17+
void mcmc_para::set_burnin(int input_burnin){burnin = input_burnin;}
18+
int mcmc_para::get_burnin(void){return burnin;}
19+
20+
void mcmc_para::set_B(int V, int R){
21+
B.zeros(V, R);
22+
}
23+
mat mcmc_para::get_B(void){return B;}
24+
25+
void mcmc_para::set_Lambda(int n, int R){
26+
Lambda.zeros(R, R, n);
27+
}
28+
cube mcmc_para::get_Lambda(void){return Lambda;}
29+
30+
void mcmc_para::set_Gamma(int p, int R){
31+
int temp = R * (R + 1) / 2;
32+
Gamma.zeros(p, temp);
33+
}
34+
//mcmc parameters
35+
mat mcmc_para::get_Gamma(void){return Gamma;}
36+
37+
void mcmc_para::set_sigma(double in = 1.0){sigma = in;}
38+
double mcmc_para::get_sigma(void){return sigma;}
39+
40+
void mcmc_para::set_sig_gam(double in = 1.0){sig_gam = in;}
41+
double mcmc_para::get_sig_gam(void){return sig_gam;}
42+
43+
void mcmc_para::set_b1(double in = .01){b1 = in;}
44+
double mcmc_para::get_b1(void){return b1;}
45+
46+
void mcmc_para::set_b2(double in = .01){b2 = in;}
47+
double mcmc_para::get_b2(void){return b2;}
48+
49+
void mcmc_para::set_c1(double in = .01){c1 = in;}
50+
double mcmc_para::get_c1(void){return c1;}
51+
52+
void mcmc_para::set_c2(double in = .01){c2 = in;}
53+
double mcmc_para::get_c2(void){return c2;}
54+
55+
void mcmc_para::set_va(double in = .5){va = in;}
56+
double mcmc_para::get_va(void){return va;}
57+
58+
void mcmc_para::set_vb(double in = .5){vb = in;}
59+
double mcmc_para::get_vb(void){return vb;}
60+
61+
//mcmc slicesample parameters (may not need, if use metropolis)
62+
void mcmc_para::set_slice_niter(int in){slice_niter = in;}
63+
int mcmc_para::get_slice_niter(void){return slice_niter;}
64+
65+
void mcmc_para::set_slice_burnin(int in){slice_burnin = in;}
66+
int mcmc_para::get_slice_burnin(void){return slice_burnin;}
67+
68+
void mcmc_para::set_slice_width(int in){slice_width = in;}
69+
int mcmc_para::get_slice_width(void){return slice_width;}
70+

mcmc_para.h

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/* PX-Bayesian Low-rank Graph Regression Model
2+
* MCMCpara nested class, for parameter initialization
3+
* Andre
4+
* mcmc_para.h
5+
*
6+
*/
7+
8+
9+
#ifndef mcmc_para_H
10+
#define mcmc_para_H
11+
12+
#include <armadillo>
13+
14+
15+
class mcmc_para
16+
{
17+
int niter;
18+
int burnin;
19+
double sigma;
20+
double sig_gam;
21+
double b1;
22+
double b2;
23+
double c1;
24+
double c2;
25+
double va;
26+
double vb;
27+
int slice_niter;
28+
int slice_burnin;
29+
int slice_width;
30+
31+
32+
public:
33+
arma::mat B;
34+
arma::cube Lambda;
35+
arma::mat Gamma;
36+
37+
38+
//mcmc parameters
39+
void set_niter(int input_niter);
40+
int get_niter(void);
41+
42+
void set_burnin(int input_burnin);
43+
int get_burnin(void);
44+
45+
void set_B(int V, int R);
46+
arma::mat get_B(void);
47+
48+
void set_Lambda(int V, int R);
49+
arma::cube get_Lambda(void);
50+
51+
void set_Gamma(int p, int R);
52+
arma::mat get_Gamma(void);
53+
54+
void set_sigma(double in);
55+
double get_sigma(void);
56+
57+
void set_sig_gam(double in);
58+
double get_sig_gam(void);
59+
60+
void set_b1(double in);
61+
double get_b1(void);
62+
63+
void set_b2(double in);
64+
double get_b2(void);
65+
66+
void set_c1(double in);
67+
double get_c1(void);
68+
69+
void set_c2(double in);
70+
double get_c2(void);
71+
72+
void set_va(double in);
73+
double get_va(void);
74+
75+
void set_vb(double in);
76+
double get_vb(void);
77+
78+
// for slicesample, if needed (if not use metropolis)
79+
void set_slice_niter(int in);
80+
int get_slice_niter(void);
81+
82+
void set_slice_burnin(int in);
83+
int get_slice_burnin(void);
84+
85+
void set_slice_width(int in);
86+
int get_slice_width(void);
87+
};
88+
89+
90+
#endif

0 commit comments

Comments
 (0)