2009-04-22 4 views
1

Je suis en train d'écrire une bibliothèque d'algorithmes évolutionnaires parallèles utilisant C++, MPI et CUDA. J'ai besoin d'extraire les données brutes de ma conception orientée objet et de les coller dans un tableau plat (ou std :: vector en utilisant stl-mpi) pour qu'il soit envoyé aux nœuds ou au périphérique cuda.C++: paramètres de modèle variable (pour l'algorithme génétique)

La conception complète est assez complexe avec beaucoup d'héritage à garder la bibliothèque flexible. Mais les classes d'intérêt sont:

Classe de génome - contient le vecteur de données. par exemple. flotteurs ou bouses.

Classe de population - contient un vecteur d'objets génomiques et est initialisé avec un objet génome.

d'abord un objet génome est créé, puis une référence à elle est transmise au constructeur de la classe de la population qui crée son propre vecteur des génomes basés sur un passé. (L'espoir qui fait sens!)

Je pensais que je voudrais ajouter un autre vecteur membre, dire rawData à la classe de la population. Mais le type de rawData devrait dépendre du type de données stockées dans les génomes (ou l'objet original du génome).
Ici réside le problème, autant que je sache, il n'y a aucun moyen de définir dynamiquement le type passé au modèle.

mon pseudo-code serait

class genome { 
    std::vector<bool> data; 
} 

template <class T> 
class population { 
    std::vector<genome> population; 
    std::vector<T> rawData; 
    void PackDataIntoRawData(); 
}; 

puis quand je crée la population (qui est en fait un objet membre d'une autre classe), je qualifierais:

genome myBitGenome(); 
population<type of myBitGenome.data> pop(myBitGenome); 

Y at-il de toute façon à faites-le, ou quelqu'un peut-il suggérer une autre façon de l'implémenter?

Merci d'avance

Répondre

0

En ce qui concerne typage dynamique, boost::variant est un outil assez puissant.

Mais votre problème semble être assez simple, donc je vous conseille de faire quelque chose comme ça:

template<typename DataPiece> 
class Genome { 
    typedef std::vector<DataPiece> Data; 
    Data data; 
} 

template <class T_Genome> 
class Population { 
    std::vector<T_Genome> population; 
    typedef typename T_Genome::Data Data; 
    Data rawData; 
    void PackDataIntoRawData(); 
}; 

Et utilisez-le:

typedef Genome<bool> MyGenome; 
MyGenome myBItGenome; 
Population<MyGenome> pop(myBitGenome); 
0

Je ne comprends pas vraiment le problème. N'avez-vous pas juste besoin de transformer les "données brutes" en un génome? Pourquoi avez-vous besoin de le stocker? Si vous avez besoin de fonctions spéciales pour traiter différents types de données brutes, vous n'avez pas besoin de modèles, vous pouvez simplement utiliser la surcharge de fonctions.

+0

L'inverse. Ma population contient un vecteur de génomes, qui contiennent chacun des données et un tas d'autres méthodes. Je dois extraire seulement les données de ces génomes et les mettre dans un vecteur normal (pas un vecteur d'objets, je ne peux pas envoyer d'objets avec MPI). En même temps, je ne peux pas mettre des types de membres fixes dans ma population (par exemple le vecteur rawData) parce que la classe de population est utilisée avec de nombreux types de génomes différents. – zenna

0

Je ne comprends pas pourquoi vous avez besoin pour stocker le rawData en tant que membre non plus.

Avez-vous regardé la bibliothèque de sérialisation de boost?

Vous venez de fournir des fonctions de sérialisation ou des méthodes pour chacune de vos classes. Méthodes pour les collections STL & Des primitives sont déjà fournies.

E.g.

template <class T_Genome> 
class Population { 
    template<class Archive> 
    void serialize(Archive& ar, const unsigned int version) 
    { 
     using namespace boost::serialization; 
     ar & BOOST_SERIALIZATION_NVP(population); 
     // ... 
    } 

    // ... 
};