Проблема
Я хочу реализовать ряд алгоритмов, которые работают на графике и возвращают результаты для узла-пара, указывающего ли эти узлы похожи. Алгоритмы должны работать на одной узловой паре и на всех возможных узловых парах. В последнем случае необходимо вернуть коллекцию/матрицу.C++ класс дизайн: ковариации
Мой подход
алгоритмы происходят из
class SimilarityAlgorithm {
public:
Base(const Graph& G);
virtual double run(node u, node v) = 0; // indices for nodes in the graph
virtual ScoreCollection& runAll() = 0;
}
Теперь алгоритмы отличаются в использовании памяти. Некоторые алгоритмы могут быть симметричными, а оценки для (u, v) и (v, u) идентичны. Для этого требуются разные типы ScoreCollection, которые должны быть возвращены. Примером может служить разреженная матрица и треугольная матрица, которые выводятся из ScoreCollection
.
Это сводится к ковариантным типам возврата:
class SpecificAlgorithm : SimilarityAlgorithm {
public:
double run(node u, node v);
// The specific algorithm is symmetric and thus uses a symmetric matrix to save memory
SymmetricScoreCollection& runAll();
}
Вопрос
- ли этот подход к дизайну хорошей идеи для этой проблемы?
- Должен ли быть раскрыт факт, что все коллекции реализованы в виде матриц?
Вы уверены, что хотите взять узлы по значению? И попытка ковариации должна работать. – Deduplicator
Узлы на самом деле просто typedefs для unsigned long. Я думаю, что в этом случае ценность будет прекрасной. – xZA
Несомненно, если это так, идентичность, вероятно, неважная. – Deduplicator