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; } } }
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); } }