Пример #1
0
vector<float> euclid_lsh::get_projection(uint32_t seed) const {
  if (retain_projection_) {
    scoped_lock lk(cache_lock_);  // lock is needed only retain_projection
    vector<float>& proj = projection_cache_[seed];
    if (!proj.empty()) {
      return proj;
    }
    calc_projection(seed, mixable_storage_->get_model()->all_lsh_num(), proj);
    return proj;
  } else {
    vector<float> proj;
    calc_projection(seed, mixable_storage_->get_model()->all_lsh_num(), proj);
    return proj;
  }
}
Пример #2
0
double H1ProjectionIpol::get_error(int split, int son, const Ord3 &order)
{
	_F_
	sln->enable_transform(false);

	Ord3 order_rhs = order;

  calc_projection(split, son, order_rhs);

	// error
	QuadPt3D *pt = quad->get_points(order_rhs);
	int np = quad->get_num_points(order_rhs);

	double error = 0.0;
	for (int i = 0; i < int_ns[split]; i++) {
		Trf *tr = get_trf(int_trf[split][i]);

		unsigned int son_idx = base_elem->get_son(int_son[son + 1][i]);
		sln->set_active_element(mesh->elements[son_idx]);
		sln->precalculate(np, pt, FN_DEFAULT);
		scalar *rval = sln->get_fn_values();
		scalar *rdx, *rdy, *rdz;
		sln->get_dx_dy_dz_values(rdx, rdy, rdz);

		QuadPt3D * tpt = new QuadPt3D[np];
		transform_points(np, pt, tr, tpt);
		scalar * prfn = new scalar[np];
    scalar * prdx = new scalar[np];
    scalar * prdy = new scalar[np];
    scalar * prdz = new scalar[np];
		memset(prfn, 0, np * sizeof(double));
		memset(prdx, 0, np * sizeof(double));
		memset(prdy, 0, np * sizeof(double));
		memset(prdz, 0, np * sizeof(double));

		for (int i = 0; i < proj_fns; i++) {
#ifndef H3D_COMPLEX
			double * tmp = new double[np];
			ss->get_fn_values(proj[i]->idx, np, tpt, 0, tmp);
			blas_axpy(np, proj[i]->coef, tmp, 1, prfn, 1);
			ss->get_dx_values(proj[i]->idx, np, tpt, 0, tmp);
			blas_axpy(np, proj[i]->coef, tmp, 1, prdx, 1);
			ss->get_dy_values(proj[i]->idx, np, tpt, 0, tmp);
			blas_axpy(np, proj[i]->coef, tmp, 1, prdy, 1);
			ss->get_dz_values(proj[i]->idx, np, tpt, 0, tmp);
			blas_axpy(np, proj[i]->coef, tmp, 1, prdz, 1);
      delete[] tmp;
#else
			double * tmp = new double[np];
			scalar * sctmp = new scalar[np];
			ss->get_fn_values(proj[i]->idx, np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj[i]->coef, sctmp, 1, prfn, 1);
			ss->get_dx_values(proj[i]->idx, np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj[i]->coef, sctmp, 1, prdx, 1);
			ss->get_dy_values(proj[i]->idx, np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj[i]->coef, sctmp, 1, prdy, 1);
			ss->get_dz_values(proj[i]->idx, np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj[i]->coef, sctmp, 1, prdz, 1);
      delete[] tmp;
      delete[] sctmp;
#endif
		}

		for (int k = 0; k < np; k++)
			error += pt[k].w *
				(sqr(rval[k] - prfn[k]) +
				 sqr(rdx[k] * mdx[split] - prdx[k]) +
				 sqr(rdy[k] * mdy[split] - prdy[k]) +
				 sqr(rdz[k] * mdz[split] - prdz[k]));
   
  delete[] tpt;
  delete[] prfn;
  delete[] prdx;
  delete[] prdy;
  delete[] prdz;
	}

  
	sln->enable_transform(true);

	return error;
}
Пример #3
0
double H1Projection::get_error(int split, int son, const order3_t &order)
{
	_F_
	sln->enable_transform(false);

	calc_projection(split, son + 1, order);

	order3_t order_rhs = order;
	QuadPt3D *pt = quad->get_points(order_rhs);
	int np = quad->get_num_points(order_rhs);

	double error = 0.0;
	for (int i = 0; i < int_ns[split]; i++) {
		Trf *tr = get_trf(int_trf[split][i]);

		Word_t son_idx = base_elem->get_son(int_son[son + 1][i]);
		sln->set_active_element(mesh->elements[son_idx]);
		sln->precalculate(np, pt, FN_DEFAULT);
		scalar *rval = sln->get_fn_values();
		scalar *rdx, *rdy, *rdz;
		sln->get_dx_dy_dz_values(rdx, rdy, rdz);

		QuadPt3D tpt[np];
		transform_points(np, pt, tr, tpt);
		scalar prfn[np], prdx[np], prdy[np], prdz[np];
		memset(prfn, 0, np * sizeof(double));
		memset(prdx, 0, np * sizeof(double));
		memset(prdy, 0, np * sizeof(double));
		memset(prdz, 0, np * sizeof(double));

		for (int i = 0; i < n_fns; i++) {
#ifndef H3D_COMPLEX
			double tmp[np];
			ss->get_fn_values(fn_idx[i], np, tpt, 0, tmp);
			blas_axpy(np, proj_coef[i], tmp, 1, prfn, 1);
			ss->get_dx_values(fn_idx[i], np, tpt, 0, tmp);
			blas_axpy(np, proj_coef[i], tmp, 1, prdx, 1);
			ss->get_dy_values(fn_idx[i], np, tpt, 0, tmp);
			blas_axpy(np, proj_coef[i], tmp, 1, prdy, 1);
			ss->get_dz_values(fn_idx[i], np, tpt, 0, tmp);
			blas_axpy(np, proj_coef[i], tmp, 1, prdz, 1);
#else
			double tmp[np];
			scalar sctmp[np];
			ss->get_fn_values(fn_idx[i], np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj_coef[i], sctmp, 1, prfn, 1);
			ss->get_dx_values(fn_idx[i], np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj_coef[i], sctmp, 1, prdx, 1);
			ss->get_dy_values(fn_idx[i], np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj_coef[i], sctmp, 1, prdy, 1);
			ss->get_dz_values(fn_idx[i], np, tpt, 0, tmp);
			for (int ii = 0; ii < np; ii++) sctmp[ii] = tmp[ii];
			blas_axpy(np, proj_coef[i], sctmp, 1, prdz, 1);
#endif
		}

		for (int k = 0; k < np; k++)
			error += pt[k].w *
				(sqr(rval[k] - prfn[k]) +
				 sqr(rdx[k] * mdx[split] - prdx[k]) +
				 sqr(rdy[k] * mdy[split] - prdy[k]) +
				 sqr(rdz[k] * mdz[split] - prdz[k]));
	}

	sln->enable_transform(true);

	return error;
}