#ifndef __funcNK #define __funcNK #include #include #include using namespace std; template< class EOT > class FuncNK : public eoEvalFunc { public: // tables des contributions double ** tables; // liste des liens epistatiques en fonction du bit i // pour chaque contribution, donne la liste des variables consernés unsigned ** links; // liste inverse // pour chaque variable, donne la liste indices des contributions vector * knils; unsigned N; unsigned K; // constructeur vide FuncNK() : N(0), K(0) { tables = NULL; links = NULL; }; FuncNK(unsigned _n) : N(_n), K(0) { tables = NULL; links = NULL; }; // construction de tables aléatoirement FuncNK(int n, int k, bool consecutive = false) : N(n), K(k) { if (consecutive) consecutiveTables(); else randomTables(); }; // construction à partir d'un fichier des tables et des liens FuncNK(const char * fichier = "") { load(fichier); }; ~FuncNK() { deleteTables(); }; void buildTables() { links = new unsigned*[N]; knils = new vector[N]; tables = new double*[N]; for(unsigned i = 0; i < N; i++) { tables[i] = new double[1<<(K+1)]; links[i] = new unsigned[K+1]; knils[i].clear(); } }; void deleteTables() { if (links != NULL) { for(int i = 0; i < N; i++) { delete [] (links[i]); } delete [] links; links = NULL; } if (knils != NULL) { /* for(int i = 0; i < N; i++) { knils[i].clear(); } */ delete [] knils; knils = NULL; } if (tables != NULL) { for(int i = 0; i < N; i++) { delete [] (tables[i]); } delete [] tables; tables = NULL; } }; virtual void load(const char * nomTables) { fstream file; file.open(nomTables, ios::in); if (file.is_open()) { //cout <<"loadTables: chargement des tables " <> s; while (s[0] == 'c') { getline(file,line,'\n'); file >> s; } // lecture des parametres if (s[0] != 'p') { cerr <<"loadTables: erreur de lecture de paramètre pour " << nomTables <> s; if (s != "NK") { cerr <<"erreur " <> N >> K; buildTables(); // lecture des liens if (s[0] != 'p') { cerr <<"loadTables: erreur de lecture de paramètre 'links' pour " << nomTables <> s; if (s == "links") { loadLinks(file); } else { cerr <<"loadTables: erreur de lecture de paramètre 'links' pour " << nomTables <> s; if (s == "tables") { loadTables(file); } else { cerr << "loadTables: erreur de lecture de paramètre 'tables' pour " << nomTables <> links[i][j]; knils[links[i][j]].push_back(i); } } void loadTables(fstream & file) { for(int j = 0; j < (1<<(K+1)); j++) for(int i = 0; i < N; i++) file >> tables[i][j]; } virtual void save(const char * nomTables) { // cout <<"saveTables: sauvegarde de la table " <=0; j--) perm(tabTirage, t[j], N-1-j); }; void consecutiveLinks(int i) { for(int j=0; j