Exemplo n.º 1
0
void Slater::updateInverse()
{
    ratio = getRatio();

    if (UP) // only updating the UP matrix
    {
        int i = currentParticle;

        SUP.zeros();
        // updating all but the ith column of the inverse slater matrix
        for (int j = 0; j < N; j++) // loop over columns j != i
        {
            if (j == i) continue; // not for column i
            for (int l = 0; l < N; l++) // loop over elements in column j
            {
                SUP(j) += slaterUPnew(i,l)*slaterUPinvOld(l,j);
            }
        }
        for (int j = 0; j < N; j++) // loop over columns in the inverse slater matrix
        {
            if (j == i) continue; // not updating column i
            for (int k = 0; k < N; k++) // loop over elements in column j
            {
                // maybe we should recalculate the ratio first to be sure??
                slaterUPinvNew(k,j) = slaterUPinvOld(k,j) - SUP(j)*slaterUPinvOld(k,i)/ratioUP;
            }
        }
        // updating column i of the inverse slater matrix
        for (int k = 0; k < N; k++) // loop over elements in i'th column
        {
            slaterUPinvNew(k,i) = slaterUPinvOld(k,i)/ratioUP;
        }
    }
    else // only updating the DOWN matrix
    {
        int i = currentParticle - N;

        SDOWN.zeros();
        // updating all but the ith column of the inverse slater matrix
        for (int j = 0; j < N; j++) // loop over columns j != i
        {
            if (j == i) continue; // not for column i
            for (int l = 0; l < N; l++) // loop over elements in column j
            {
                SDOWN(j) += slaterDOWNnew(i,l)*slaterDOWNinvOld(l,j);
            }
        }
        for (int j = 0; j < N; j++) // loop over columns in the inverse slater matrix
        {
            if (j == i) continue; // not updating column i
            for (int k = 0; k < N; k++) // loop over elements in column j
            {
                // maybe we should recalculate the ratio first to be sure??
                slaterDOWNinvNew(k,j) = slaterDOWNinvOld(k,j) - SDOWN(j)*slaterDOWNinvOld(k,i)/ratioDOWN;
            }
        }
        // updating column i of the inverse slater matrix
        for (int k = 0; k < N; k++) // loop over elements in i'th column
        {
            slaterDOWNinvNew(k,i) = slaterDOWNinvOld(k,i)/ratioDOWN;
        }
    }
}
Exemplo n.º 2
0
void k_additive_objectif(int *n, int *k, int *subset, int *Integral, double *X,
			 int *nX, double *R, double *xl, double *xu)
{
  int i,j,l,m,p,q;
  int sb = (int)sum_binom(*n,*k);
  double min_x, min_xplus, min_xminus;

  p = 0;
  q = 0;

  /* On parcourt les "lignes" de X */ 
  for (m=0;m<*nX;m++) {

    if (*Integral==1) {
      /* Choquet */
      for (i=1;i<sb;i++) {
	
	for (j=0;j<*n;j++)
	  if (subset[i] & 1<<j) {
	    
	    min_x = X[j+p];
	    break;
	  }
	for (l=j+1;l<*n;l++)
	  if (subset[i] & 1<<l) 
		min_x = INF(min_x, X[l+p]);
	
	R[i - 1 + q] = min_x;
      }
    }
    else {
      /* Sipos */
      for (i=1;i<sb;i++) {
	
	for (j=0;j<*n;j++)
	  if (subset[i] & 1<<j) {
	    
	    min_xplus = SUP(X[j+p],0);
	    min_xminus = SUP(-X[j+p],0);
	    break;
	  }
	for (l=j+1;l<*n;l++)
	  if (subset[i] & 1<<l) {

		min_xplus = INF(min_xplus, SUP(X[l+p],0));
		min_xminus = INF(min_xminus, SUP(-X[l+p],0));
	  }
	
	R[i - 1 + q] = min_xplus - min_xminus;
      }
    }
    p += *n;
    q += sb - 1;
  }

  /*  Initialise la borne inf. et sup. de la representation de Möbius */
  for (i=0;i<sb-1;i++) {

    xl[i]=(double)lower_bound(i+1, *n);
    xu[i]=(double)upper_bound(i+1, *n);
  }
  

}