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; } }
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; }
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; }