summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2017-03-31 18:01:43 -0400
committerGuillaume Horel <guillaume.horel@gmail.com>2017-03-31 18:02:04 -0400
commit34a4f0125e1e56390e025381f10f28a2d3b7ea4a (patch)
tree28ec33079fa025d9969cc486ae3ffedbe31e4df7
parentf0653d4b0e7294a5665465951410c51c2daf93ca (diff)
downloadlossdistrib-34a4f0125e1e56390e025381f10f28a2d3b7ea4a.tar.gz
try to fix lossdistrib_joint_Z
-rw-r--r--R/distrib.R13
-rw-r--r--src/lossdistrib.c10
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);
}