CAMLprim value ml_gsl_sort_vector_smallest_index (value p, value v) { GSL_PERMUT_OF_BIGARRAY(p); _DECLARE_VECTOR(v); _CONVERT_VECTOR(v); gsl_sort_vector_smallest_index (perm_p.data, perm_p.size, &v_v); return Val_unit; }
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); }