Matrix<double> Camera::getView() { this->direction.normalize(); this->up = Vector::cross(this->direction, this->right); this->up.normalize(); this->right = Vector::cross(this->up, this->direction); this->right.normalize(); double x = -Vector::scalar(this->right, this->position); double y = -Vector::scalar(this->up, this->position); double z = -Vector::scalar(this->direction, this->position); Matrix<double> tmp(4, 4); tmp.setColumn(0, this->right.getArray()); tmp.setColumn(1, this->up.getArray()); tmp.setColumn(2, this->direction.getArray()); IArray<double> itmp(tmp[3]); itmp[0].updatedir(x); itmp[1].updatedir(y); itmp[2].updatedir(z); itmp[3].updatedir(1); return tmp; }
/** * Description not yet available. * \param */ void laplace_approximation_calculator::generate_antithetical_rvs() { // number of random vectors const ivector & itmp=(*num_local_re_array)(1,num_separable_calls); //const ivector & itmpf=(*num_local_fixed_array)(1,num_separable_calls); for (int i=2;i<=num_separable_calls;i++) { if (itmp(i) != itmp(i-1)) { cerr << "At present can only use antithetical rv's when " "all separable calls are the same size" << endl; ad_exit(1); } } int n=itmp(1); int samplesize=num_importance_samples; // mesh size double delta=0.01; // maximum of distribution is near here double mid=sqrt(double(n-1)); dmatrix weights(1,2*n,1,2); double spread=15; if (mid-spread<=0.001) spread=mid-0.1; double ssum=0.0; double x=0.0; double tmax=(n-1)*log(mid)-0.5*mid*mid; for (x=mid-spread;x<=mid+spread;x+=delta) { ssum+=exp((n-1)*log(x)-0.5*x*x-tmax); } double tsum=0; dvector dist(1,samplesize+1); dist.initialize(); int is=0; int ii; for (x=mid-spread;x<=mid+spread;x+=delta) { tsum+=exp((n-1)*log(x)-0.5*x*x-tmax)/ssum*samplesize; int ns=int(tsum); for (ii=1;ii<=ns;ii++) { dist(++is)=x; } tsum-=ns; } if (is==samplesize-1) { dist(samplesize)=mid; } else if (is<samplesize-1) { cerr << "This can't happen" << endl; exit(1); } // get random numbers random_number_generator rng(rseed); if (antiepsilon) { if (allocated(*antiepsilon)) { delete antiepsilon; antiepsilon=0; } } antiepsilon=new dmatrix(1,samplesize,1,n); dmatrix & M=*antiepsilon; M.fill_randn(rng); for (int i=1;i<=samplesize;i++) { M(i)=M(i)/norm(M(i)); } int nvar=(samplesize-1)*n; independent_variables xx(1,nvar); ii=0; for (int i=2;i<=samplesize;i++) { for (int j=1;j<=n;j++) { xx(++ii)=M(i,j); } } fmmt1 fmc(nvar,5); //fmm fmc(nvar,5); fmc.noprintx=1; fmc.iprint=10; fmc.maxfn=2500; fmc.crit=1.e-6; double f; double fbest=1.e+50;; dvector g(1,nvar); dvector gbest(1,nvar); dvector xbest(1,nvar); gbest.fill_seqadd(1.e+50,0.); { while (fmc.ireturn>=0) { //int badflag=0; fmc.fmin(f,xx,g); if (fmc.ihang) { //int hang_flag=fmc.ihang; //double maxg=max(g); //double ccrit=fmc.crit; //int current_ifn=fmc.ifn; } if (fmc.ireturn>0) { f=fcomp1(xx,dist,samplesize,n,g,M); if (f < fbest) { fbest=f; gbest=g; xbest=xx; } } } xx=xbest; } ii=0; for (int i=2;i<=samplesize;i++) { for (int j=1;j<=n;j++) { M(i,j)=xx(++ii); } } for (int i=1;i<=samplesize;i++) { M(i)*=dist(i)/norm(M(i)); } }