CAMLprim value ml_gsl_stats_covariance_m(value mean1, value data1, value mean2, value data2) { size_t len = Double_array_length(data1); double result; check_array_size(data1, data2); result = gsl_stats_covariance_m(Double_array_val(data1), 1, Double_array_val(data2), 1, len, Double_val(mean1), Double_val(mean2)); return copy_double(result); }
void update_chi2_t(chi2_t *chichi, hist_t *obsHist, double *dataMat) { //-- data should be n*d matrix int N = chichi->N; int d = chichi->d; gsl_vector *X_model = chichi->X_model; gsl_matrix *cov = chichi->cov; gsl_matrix *cov2 = chichi->cov2; double value; //-- Update mean int i; for (i=0; i<d; i++) { value = gsl_stats_mean(dataMat+i*N, 1, N); gsl_vector_set(X_model, i, value); gsl_vector_set(chichi->X_obs, i, (double)(obsHist->n[i])); } //-- Update covariance int j; for (j=0; j<d; j++) { for (i=0; i<d; i++) { if (i < j) { value = gsl_matrix_get(cov, j, i); gsl_matrix_set(cov, i, j, value); continue; } value = gsl_stats_covariance_m(dataMat+i*N, 1, dataMat+j*N, 1, N, gsl_vector_get(X_model, i), gsl_vector_get(X_model, j)); gsl_matrix_set(cov, i, j, value); } } //-- Make a copy, because the invertion will destroy cov gsl_matrix_memcpy(cov2, cov); //-- Copy cov to cov2 //-- Make LU decomposition and invert int s; gsl_linalg_LU_decomp(cov2, chichi->perm, &s); gsl_linalg_LU_invert(cov2, chichi->perm, chichi->invCov); //-- Debias the C_{ij}^{-1} //-- C^-1_nonbias = (N - d - 2) / (N - 1) * C^-1_bias double factor = (N - d - 2) / (double)(N - 1); gsl_matrix_scale(chichi->invCov, factor); //-- invCov *= factor return; }
void GbA::compute_likelihood(double *data, int nstats, int nbands, int nsim, double mean[2], double cov[2][2]){ int i, j, k, l, idx; gsl_vector *lsq = gsl_vector_alloc (_td->get_noftraces()); gsl_vector *input = gsl_vector_alloc (nbands); gsl_vector *trace = gsl_vector_alloc (nbands); double *mags, *dists; double misfit_l2; size_t *indices = new size_t[nsim]; mags = new double[nsim]; dists = new double[nsim]; for (i=0; i<nstats; i++){ for (j=0; j<nbands; j++){ gsl_vector_set(input, j, std::log10(data[i*nbands+j])); } for (k=0; k<_td->get_noftraces(); k++){ gsl_matrix_get_row(trace, _td->_tdata_gsl, k); gsl_vector_sub(trace,input); misfit_l2 = gsl_blas_dnrm2(trace); gsl_vector_set(lsq, k, misfit_l2*misfit_l2); } gsl_sort_vector_smallest_index(indices, nsim,lsq); mean[0] = 0; mean[1] = 0; for(l=0; l<nsim; l++){ dists[l] = std::log10(gsl_vector_get(_td->_r_gsl, indices[l])); mags[l] = gsl_vector_get(_td->_m_gsl, indices[l]); //std::cout << gsl_vector_get(_td->_m_gsl,indices[l]) << std::endl; } mean[0] = gsl_stats_mean(dists,1,nsim); mean[1] = gsl_stats_mean(mags,1,nsim); cov[0][0] = gsl_stats_variance(dists, 1, nsim); cov[1][1] = gsl_stats_variance(mags, 1, nsim); cov[0][1] = gsl_stats_covariance_m(dists,1,mags,1,nsim,mean[0],mean[1]); cov[1][0] = cov[0][1]; std::cout << "Distance: " << mean[0] << "; Magnitude: " << mean[1] << std::endl; std::cout << "Covariance matrix:" << std::endl; for(i=0; i<2; i++){ for(j=0;j<2;j++){ printf("%d, %d, %g\n",i,j,cov[i][j]); } } } }
void GbA::process(double *data, int nbands, float time, int cmpnt){ assert(nbands == _nbands); pthread_mutex_lock(&_process_lock); int i, j, k, timeidx=0; double timemin=std::numeric_limits<double>::max(); gsl_vector *lsq = gsl_vector_alloc (_td->get_noftraces()); gsl_vector *input = gsl_vector_alloc (nbands); gsl_vector *trace = gsl_vector_alloc (nbands); gsl_matrix *tdata; double misfit_l2, terror; size_t *indices = new size_t[_nsim]; TData::Component _c = static_cast<TData::Component>(cmpnt); _status[_c] = true; // Find time index for(i=0;i<_td->get_noftimes();i++){ terror = gsl_vector_get(_td->get_times(),i) - time; if(abs(terror)< timemin){ timeidx = i; timemin = abs(terror); } } tdata = _td->get_amps(timeidx,_c); for (i=0; i<nbands; i++){ gsl_vector_set(input, i, std::log10(data[i])); } for (j=0; j<_td->get_noftraces(); j++){ gsl_matrix_get_row(trace, tdata, j); gsl_vector_sub(trace,input); misfit_l2 = gsl_blas_dnrm2(trace); gsl_vector_set(lsq, j, misfit_l2*misfit_l2); } gsl_sort_vector_smallest_index(indices, _nsim,lsq); for(k=0; k<_nsim; k++){ gsl_vector_set(&_r[_c].vector,k, std::log10(gsl_vector_get(_td->get_dist(), indices[k]))); gsl_vector_set(&_m[_c].vector,k, gsl_vector_get(_td->get_mag(), indices[k])); } if (_status[TData::vertical] && _status[TData::horizontal]){ _mv = gsl_vector_subvector(_mags,0,_mags->size); _rv = gsl_vector_subvector(_dists,0,_dists->size); } else if(_status[TData::vertical]){ _mv = gsl_vector_subvector(_mags,0,_nsim); _rv = gsl_vector_subvector(_dists,0,_nsim); } else if(_status[TData::horizontal]){ _mv = gsl_vector_subvector(_mags,_nsim,_nsim); _rv = gsl_vector_subvector(_dists,_nsim,_nsim); } _mn[0] = gsl_stats_mean(_rv.vector.data,1,_rv.vector.size); _mn[1] = gsl_stats_mean(_mv.vector.data,1,_mv.vector.size); _cov[0][0] = gsl_stats_variance(_rv.vector.data, 1, _rv.vector.size); _cov[1][1] = gsl_stats_variance(_mv.vector.data, 1, _mv.vector.size); _cov[0][1] = gsl_stats_covariance_m(_rv.vector.data,1,_mv.vector.data,1, _rv.vector.size,_mn[0],_mn[1]); _cov[1][0] = _cov[0][1]; delete[] indices; pthread_mutex_unlock(&_process_lock); }