私が今何をしているのかについて、もう少し具体的に説明しましょう。さまざまなアルゴリズムのインターフェイスを定義する抽象オプティマイザー クラスがあります。Request と呼ばれるこのデータ構造の不明な量を生成および消費することで機能するため、それらのベクトルを使用できるようにします。
class Request {
public:
vector<double> x;
double y;
int id;
// [...]
}
class Asynch_Optimizer {
public:
virtual int generate_requests( vector<Request> & work ) = 0;
virtual int assimilate_results( const vector<Request> & result ) = 0;
protected:
virtual void convergence_test( const vector<Request> & population );
// [...]
}
Particle_Swarm_Optimizer は、リクエストでいくつかの追加フィールドを使用できることがわかりました。(ここで私の誤謬の匂いがします。追加フィールドは内部でのみ使用されます。リクエスト処理機構には意味がありません。すべてをうまく結合させるために、Particle にサブクラス化しました)
class Particle : public Request {
public:
vector<double> v;
vector<double> x_min;
double min_value;
// [...]
}
ここで、Particle_Swarm_Optimizer のスーパークラスに実装された一般的な収束テスト メソッドを呼び出したいと思います。ここで、データはパーティクルのベクトルにあります。新しいベクターを構築して各要素を個別にコピーキャストするよりも、 Request のベクターに変換する効率的な方法はありますか?
void opti::Particle_Swarm_Optimizer::convergence_test( const vector<Particle> & population )
{
//TODO remove slow hack
vector<Request> cast_up;
for (size_t i = 0; i < population.size(); i++) {
cast_up.push_back( population[i] );
}
Asynch_Optimizer::convergence_test( cast_up );
}
この例のデータを構造化するためのより良い方法があると思います。コンテナのテンプレートタイプをアップキャストする方法が存在するかどうか、まだ興味がありますか?