aboutsummaryrefslogtreecommitdiffstats
path: root/R
diff options
context:
space:
mode:
Diffstat (limited to 'R')
-rw-r--r--R/Makevars2
-rw-r--r--R/lossdistrib.c33
2 files changed, 35 insertions, 0 deletions
diff --git a/R/Makevars b/R/Makevars
new file mode 100644
index 00000000..89b9e09b
--- /dev/null
+++ b/R/Makevars
@@ -0,0 +1,2 @@
+PKG_CFLAGS=-fopenmp
+PKG_LIBS=-lgomp
diff --git a/R/lossdistrib.c b/R/lossdistrib.c
index c873df9e..6348b2c9 100644
--- a/R/lossdistrib.c
+++ b/R/lossdistrib.c
@@ -1,8 +1,11 @@
#include <R.h>
#include <Rmath.h>
#include <string.h>
+#include <omp.h>
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
+extern int dgemv_(char* trans, int*m, int*n, double* alpha, double* A, int* lda, double* x, int* incx,
+ double* beta, double* y, int* incy);
void lossdistrib(double *p, int *np, double *w, double *S, int *N, int* defaultflag, double *q) {
/* recursive algorithm with first order correction for computing
@@ -321,6 +324,36 @@ void addandmultiply(double *X, double alpha, double *Y, int n) {
}
}
+void lossdistrib_prepay_joint_Z(double *dp, double *pp, int *ndp, double *w,
+ double *S, int *N, int *defaultflag, double *rho,
+ double *Z, double *wZ, int *nZ, double *q) {
+ int i, j;
+ double* dpshocked = malloc(sizeof(double) * *ndp);
+ double* ppshocked = malloc(sizeof(double) * *ndp);
+ int N2 = (*N) * (*N);
+ double* qmat = malloc(sizeof(double) * N2 * (*nZ));
+
+ double alpha = 1;
+ double beta = 0;
+ int one = 1;
+ double r;
+
+ #pragma omp parallel for private(j)
+ for(i = 0; i < *nZ; i++){
+ for(j = 0; j < *ndp; j++){
+ dpshocked[j] = shockprob(dp[j], *rho, Z[i], 0);
+ ppshocked[j] = shockprob(pp[j], *rho, -Z[i], 0);
+ }
+ lossdistrib_prepay_joint(dpshocked, ppshocked, ndp, w, S + *ndp *i, N, defaultflag, qmat + N2 * i);
+ }
+
+ dgemv_("n", &N2, nZ, &alpha, qmat, &N2, wZ, &one, &beta, q, &one);
+ free(dpshocked);
+ free(ppshocked);
+ free(qmat);
+}
+
+
void BClossdist(double *SurvProb, int *dim1, int *dim2, double *issuerweights,
double *recov, double *Z, double *w, int *n, double *rho, int *N,
int *defaultflag, double *L, double *R) {