diff options
| -rw-r--r-- | R/distrib.R | 13 | ||||
| -rw-r--r-- | src/lossdistrib.c | 10 |
2 files changed, 6 insertions, 17 deletions
diff --git a/R/distrib.R b/R/distrib.R index 2b19aa6..26b62cc 100644 --- a/R/distrib.R +++ b/R/distrib.R @@ -364,19 +364,6 @@ recovdistC <- function(dp, pp, w, S, N){ as.double(w), as.double(S), as.integer(N), q = double(N))$q } -lossdistC.jointZ <- function(dp, w, S, N, defaultflag = FALSE, rho, Z, wZ){ - ## N is the size of the grid - ## dp is of size n.credits - ## w is of size n.credits - ## S is of size n.credits by nZ - ## rho is a double - ## Z is a vector of length nZ - ## w is a vector if length wZ - r <- .C("lossdistrib_joint_Z", as.double(dp), as.integer(length(dp)), - as.double(w), as.double(S), as.integer(N), as.logical(defaultflag), as.double(rho), - as.double(Z), as.double(wZ), as.integer(length(Z)), q = matrix(0, N, N))$q -} - lossdistC.prepay.joint <- function(dp, pp, w, S, N, defaultflag=FALSE){ ## C version of lossdist.prepay.joint r <- .C("lossdistrib_joint", as.double(dp), as.double(pp), as.integer(length(dp)), diff --git a/src/lossdistrib.c b/src/lossdistrib.c index 35720ea..b1b78c4 100644 --- a/src/lossdistrib.c +++ b/src/lossdistrib.c @@ -414,15 +414,15 @@ void lossdistrib_joint_Z(const double *dp, const double *pp, const int *ndp, double *q) { int N2 = (*N) * (*N); - double* qmat = malloc(sizeof(double) * N2 * (*nZ)); + double* qmat = calloc(N2 * (*nZ), sizeof(double)); const double alpha = 1; const double beta = 0; - #pragma omp parallel for for(int i = 0; i < *nZ; i++){ double* dpshocked = malloc(sizeof(double) * (*ndp)); - double* ppshocked = 0; + double* Sshocked = malloc(sizeof(double) * (*ndp)); + double* ppshocked = NULL; if(pp) { ppshocked = malloc(sizeof(double) * (*ndp)); } @@ -431,11 +431,13 @@ void lossdistrib_joint_Z(const double *dp, const double *pp, const int *ndp, if(pp) { ppshocked[j] = shockprob(pp[j], rho[j], -Z[i], 0); } + Sshocked[j] = shockseverity(S[j], Z[i], rho[j], dp[j]); } - lossdistrib_joint(dpshocked, ppshocked, ndp, w, S + (*ndp) * i, + lossdistrib_joint(dpshocked, ppshocked, ndp, w, Sshocked, N, defaultflag, qmat + N2 * i); free(dpshocked); + free(Sshocked); if(pp) { free(ppshocked); } |
