Beispiel #1
0
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);

}
Beispiel #2
0
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));
      }
    }
  }
}
Beispiel #3
0
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;
}