#include "rbfcore.h" #include "utility.h" #include "Solver.h" #include #include #include #include #include #include #include #include #include #include "readers.h" //#include "mymesh/UnionFind.h" //#include "mymesh/tinyply.h" typedef std::chrono::high_resolution_clock Clock; double randomdouble() {return static_cast (rand()) / static_cast (RAND_MAX);} double randomdouble(double be,double ed) {return be + randomdouble()*(ed-be); } void RBF_Core::NormalRecification(double maxlen, vector&nors){ double maxlen_r = -1; auto p_vn = nors.data(); int np = nors.size()/3; if(1){ for(int i=0;ilabelcolor(npt*4); // vectorf2v; // uchar red[] = {255,0,0, 255}; // uchar green[] = {0,255,0, 255}; // uchar blue[] = {0,0,255, 255}; // for(int i=0;inors; if(mode ==0)nors=initnormals; else if(mode == 1)nors=newnormals; else if(mode == 2)nors = initnormals_uninorm; NormalRecification(1.,nors); //for(int i=0;i&pts){ cout<<"Set_HermiteRBF"< 0 ? user_ls : 0; } void RBF_Core::Set_Actual_Hermite_LSCoef(double hermite_ls){ ls_coef = Hermite_ls_weight_inject = hermite_ls > 0?hermite_ls:0; } void RBF_Core::Set_SparsePara(double spa){ sparse_para = spa; } void RBF_Core::Set_User_Lamnda_ToMatrix(double user_ls){ { Set_Actual_User_LSCoef(user_ls); auto t1 = Clock::now(); cout<<"setting K, HermiteApprox_Lamnda"<0){ arma::sp_mat eye; eye.eye(npt,npt); dI = inv(eye + User_Lamnbda*K00); saveK_finalH = K = K11 - (User_Lamnbda)*(K01.t()*dI*K01); }else saveK_finalH = K = K11; cout<<"solved: "<<(std::chrono::nanoseconds(Clock::now() - t1).count()/1e9)<0){ arma::sp_mat eye; eye.eye(npt,npt); if(ls_coef > 0){ arma:: mat tmpdI = inv(eye + (ls_coef+User_Lamnbda)*K00); K = K11 - (ls_coef+User_Lamnbda)*(K01.t()*tmpdI*K01); }else{ K = saveK_finalH; } } cout<<"solved: "<<(std::chrono::nanoseconds(Clock::now() - t1).count()/1e9)<&pts){ Set_HermiteRBF(pts); auto t1 = Clock::now(); cout<<"setting K"<&x, vector&grad, void *fdata){ auto t1 = Clock::now(); RBF_Core *drbf = reinterpret_cast(fdata); int n = drbf->npt; arma::vec arma_x(n*3); //( sin(a)cos(b), sin(a)sin(b), cos(a) ) a =>[0, pi], b => [-pi, pi]; vectorsina_cosa_sinb_cosb(n * 4); for(int i=0;iisuse_sparse)a2 = drbf->sp_H * arma_x; //else a2 = drbf->finalH * arma_x; if (!grad.empty()) { grad.resize(n*2); for(int i=0;iupper(npt*2); vectorlower(npt*2); for(int i=0;i0)y.subvec(0,npt-1) = -User_Lamnbda*dI*K01*y.subvec(npt,npt*4-1); a = Minv*y; b = Ninv.t()*y; } } int RBF_Core::Lamnbda_Search_GlobalEigen(){ vectorlamnbda_list({0, 0.001, 0.01, 0.1, 1}); //vectorlamnbda_list({ 0.5,0.6,0.7,0.8,0.9,1,1.1,1.5,2,3}); //lamnbda_list.clear(); //for(double i=1.5;i<2.5;i+=0.1)lamnbda_list.push_back(i); //vectorlamnbda_list({0}); vectoriniten_list(lamnbda_list.size()); vectorfinalen_list(lamnbda_list.size()); vector>init_normallist; vector>opt_normallist; lamnbda_list_sa = lamnbda_list; for(int i=0;i "< "<