我正在尝试使用HMC通过自定义目标函数进行MCMC采样。我有我的HMC代码,但它不能很好地工作。我最近知道" stan"它具有更强大的HMC模型。所以我想用" stan"。
来实现我的代码我已经编写了目标函数以及C中的导数函数。它涉及for循环,以及Cholesky分解和Lapack的其他线性代数所需的函数。我真的不想在斯坦那里重新编码。有没有办法直接使用我的功能?如果有人能提供一些关于如何修改我的代码的线索,或者教我如何修改" stan"码。以下是我的代码的一部分:
void get_V(double phi, double sigmasq, double k, double *neardist,
double *neardistM, int *nearind, double *w, int n, int m, double *V){
double one = 1.0, var;
int i, j, dim ,info, int_one = 1;
double *u, *temp_neardistM;
char UPLO = 'L';
char SIDE = 'L', DIAG = 'N';
char TRANS = 'N', TRANS2 = 'T';
var = (double)(1/k) * sigmasq;
V[0] = var;
for (i = 1; i < n ; i++){
if(i < m) {
dim = i;
}
else {
dim = m;
}
...
// Cholesky decomposition of temp_neardistM
info = -1;
dpotrf_(&UPLO, &dim, temp_neardistM, &dim, &info);
if (info != 0) {free(temp_neardistM); return ;}
...
// get Vi
dtrsm_(&SIDE, &UPLO, &TRANS, &DIAG, &dim, &int_one, &one, temp_neardistM, &dim, u, &dim);
V[i] = (var - sigmasq * (sq_sum(u, dim)) );
...
}
}