diff options
Diffstat (limited to 'R/lossdistrib.c')
| -rw-r--r-- | R/lossdistrib.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/R/lossdistrib.c b/R/lossdistrib.c index 3ad21069..0a2c30ab 100644 --- a/R/lossdistrib.c +++ b/R/lossdistrib.c @@ -14,6 +14,7 @@ extern void openblas_set_num_threads(int); void omp_set_num_threads(int);
void lossdistrib(double *p, int *np, double *w, double *S, int *N, int *defaultflag, double *q);
+void lossdistrib_blas(double *p, int *np, double *w, double *S, int *N, int *defaultflag, double *q);
double shockprob(double p, double rho, double Z, int give_log);
@@ -165,8 +166,8 @@ void lossdistrib_Z(double *p, int *np, double *w, double *S, int *N, int *defaul for(j = 0; j < *np; j++){
pshocked[j + (*np) * i] = shockprob(p[j], rho[j], Z[i], 0);
}
- lossdistrib(pshocked + (*np) * i, np, w, S + (*np) * i, N,
- defaultflag, q + (*N) * i);
+ lossdistrib_blas(pshocked + (*np) * i, np, w, S + (*np) * i, N,
+ defaultflag, q + (*N) * i);
}
free(pshocked);
}
@@ -617,7 +618,11 @@ void shockprobvec2(double p, double rho, double* Z, int nZ, double *q){ }
double shockseverity(double S, double Z, double rho, double p){
- return( exp(shockprob(S * p, rho, Z, 1) - shockprob(p, rho, Z, 1)) );
+ if(p==0){
+ return 0;
+ }else{
+ return( exp(shockprob(S * p, rho, Z, 1) - shockprob(p, rho, Z, 1)) );
+ }
}
double quantile(double* Z, double* w, int nZ, double p0){
@@ -747,11 +752,11 @@ void BClossdist(double *defaultprob, int *dim1, int *dim2, 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 dim2)
+ 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
+ rho: correlation beta vector (length dim1)
N: number of ticks in the grid
defaultflag: if true, computes the default distribution
outputs:
|
