0

我正在尝试使用 HMC 通过自定义目标函数进行 MCMC 采样。我有我的 HMC 代码,但它不能很好地工作。我最近知道“stan”,它有一个更强大的 HMC 模型。所以我想用“stan”来实现我的代码。

我已经用 C 编写了目标函数和导数函数。它涉及 for 循环,以及 Cholesky 分解和 Lapack 中的其他线性代数所需的函数。我真的不想在 stan 中重新编码它。有没有办法直接使用我的功能?如果有人能提供一些关于如何修改我的代码的线索,或者教我如何修改“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)) );

    ...

    }
}
4

0 回答 0