Exemple #1
0
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;
}
Exemple #2
0
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]);
			}
		}
	}
}
Exemple #3
0
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);
}