void ERMSD::setReference(const vector<Vector> & reference, const std::vector<unsigned> & pairs_vec, double mycutoff) { natoms = reference.size(); nresidues = natoms/3; unsigned npairs = pairs_vec.size()/2; pairs.resize(npairs); //for(unsigned i=0;i<2*npairs;++i) { // std::cout << "CCC " << pairs_vec[i] << " "; //} for(unsigned i=0; i<npairs; ++i) { pairs[i].first = pairs_vec[2*i]; pairs[i].second = pairs_vec[2*i+1]; } cutoff = mycutoff; std::vector<TensorGeneric<4,3> > deri; deri.resize(natoms*natoms); reference_mat.resize(nresidues*nresidues); Pbc fake_pbc; calcMat(reference,fake_pbc,reference_mat,deri); }
void critfunc(double *grad, int *nPar, int *nD, double *probs, int *M, double *design, double *n2, double *nold, double *A, double *tol, double *MEDgrad, int *type, int *stand, double *res){ // grad - contains gradient vectors (4 cells reserved for each model) // nPar - number of parameters (dim A) // nD - number of dose-levels // design - design // type - 1: MED, 2: Dopt, 3: MED&Dopt int m,incgrad=0,incb=0; double resM=0,resD=0,fracp=0; // variables for SVD decomposition, initialize to max possible dimension double work[30]={0.0}; double s[4]={0.0}; double VT[16]={0.0}; double U[16]={0.0}; *res = 0.0; // calculate weight vector getAllocs(design, n2, nold, nD); for(m=0;m<*M;m++){ if(m > 0){ incgrad+=*nD*nPar[m-1]; incb+=nPar[m-1]; } setzero(A, 16);resM = 0.0; // calulate matrix calcMat(grad, &nPar[m], design, nD, A, &incgrad); // calculate det and/or MP-Inverse calcDetGinv(A, &nPar[m], work, s, VT, U, tol, type, &resD); if(*type == 1){ // calculate quadratic form (for MED designs) calcQuadform(MEDgrad, A, &nPar[m], &resM, &incb); *res += probs[m]*log(resM); } if(*type == 2){ if(*stand == 1){ fracp = (double) nPar[m]; *res += probs[m]*(-log(resD)/fracp); } else { *res += probs[m]*(-log(resD)); } } if(*type == 3){ // calculate quadratic form (for MED designs) calcQuadform(MEDgrad, A, &nPar[m], &resM, &incb); if(*stand == 1){ fracp = (double) nPar[m]; *res += probs[m]*(-0.5*log(resD)/fracp+0.5*log(resM)); } else { *res += probs[m]*(-0.5*log(resD)+0.5*log(resM)); } } } }
double ERMSD::calculate(const std::vector<Vector> & positions,const Pbc& pbc,\ std::vector<Vector> &derivatives, Tensor& virial) { double ermsd=0.; std::vector<Vector4d> mat; mat.resize(nresidues*nresidues); std::vector<TensorGeneric<4,3> > Gderi; Gderi.resize(natoms*natoms); calcMat(positions,pbc,mat,Gderi); unsigned idx1 = 0; for(unsigned i=0; i<nresidues; i++) { for(unsigned j=0; j<nresidues; j++) { unsigned ii = i*nresidues + j; Vector4d dd = delta(reference_mat[ii],mat[ii]); double val = dd.modulo2(); //std::cout << "AAA " << i << " " << j << " " << ii << " "<< val << "\n"; if(val>0.0 && i!=j) { for(unsigned k=0; k<3; k++) { idx1 = i*nresidues*6 + j*6 + k; derivatives[3*i+k] += matmul(dd,Gderi[idx1]); derivatives[3*j+k] += matmul(dd,Gderi[idx1+3]); } ermsd += val; } } } //std::cout << ermsd << " "; //if(pairs.size()!=0) nresidues=pairs.size(); //std::cout << ermsd << " " << nresidues; ermsd = sqrt(ermsd/nresidues); double iermsd = 1.0/(ermsd*nresidues); for(unsigned i=0; i<natoms; ++i) {derivatives[i] *= iermsd;} return ermsd; }