diff options
Diffstat (limited to 'src/lossdistrib.c')
| -rw-r--r-- | src/lossdistrib.c | 59 |
1 files changed, 55 insertions, 4 deletions
diff --git a/src/lossdistrib.c b/src/lossdistrib.c index f12ab2f..e5f2c53 100644 --- a/src/lossdistrib.c +++ b/src/lossdistrib.c @@ -728,10 +728,10 @@ void lossdistrib_joint_Z(double *dp, int *ndp, double *w, free(qmat);
}
-void BClossdist(double *defaultprob, int *dim1, int *dim2,
- double *issuerweights, double *recov, double *Z, double *w,
- int *n, double *rho, int *N, int *defaultflag,
- double *L, double *R) {
+void BCloss_recov_dist(double *defaultprob, int *dim1, int *dim2,
+ double *issuerweights, double *recov, double *Z, double *w,
+ int *n, double *rho, int *N, int *defaultflag,
+ double *L, double *R) {
/*
computes the loss and recovery distribution over time with a flat gaussian
correlation
@@ -788,3 +788,54 @@ void BClossdist(double *defaultprob, int *dim1, int *dim2, free(Lw);
free(Rw);
}
+
+
+void BCloss_dist(double *defaultprob, int *dim1, int *dim2,
+ double *issuerweights, double *recov, double *Z, double *w,
+ int *n, double *rho, int *N, int *defaultflag,
+ double *L) {
+ /*
+ computes the loss distribution over time with a flat gaussian
+ correlation
+ inputs:
+ defaultprob: matrix of size dim1 x dim2. dim1 is the number of issuers
+ and dim2 number of time steps
+ issuerweights: vector of issuer weights (length dim1)
+ recov: vector of recoveries (length dim1)
+ Z: vector of factor values (length n)
+ w: vector of factor weights (length n)
+ rho: correlation beta vector (length dim1)
+ N: number of ticks in the grid
+ defaultflag: if true, computes the default distribution
+ outputs:
+ L: matrix of size (N, dim2)
+ */
+ int t, i, j;
+ double g;
+ double *gshocked, *Sshocked, *Lw;
+ int one = 1;
+ double alpha = 1;
+ double beta = 0;
+
+ gshocked = malloc((*dim1) * (*n) * sizeof(double));
+ Sshocked = malloc((*dim1) * (*n) * sizeof(double));
+ Lw = malloc((*N) * (*n) * sizeof(double));
+
+ for(t=0; t < (*dim2); t++) {
+ memset(Lw, 0, (*N) * (*n) * sizeof(double));
+ #pragma omp parallel for private(j, g)
+ for(i=0; i < *n; i++){
+ for(j=0; j < (*dim1); j++){
+ g = defaultprob[j + (*dim1) * t];
+ gshocked[j+(*dim1)*i] = shockprob(g, rho[j], Z[i], 0);
+ Sshocked[j+(*dim1)*i] = shockseverity(1-recov[j], Z[i], rho[j], g);
+ }
+ lossdistrib_blas(gshocked + (*dim1) * i, dim1, issuerweights, Sshocked + (*dim1)*i, N, defaultflag,
+ Lw + i * (*N));
+ }
+ dgemv_("n", N, n, &alpha, Lw, N, w, &one, &beta, L + t * (*N), &one);
+ }
+ free(gshocked);
+ free(Sshocked);
+ free(Lw);
+}
|
