Лимонный граф из сети Omnet ++

Я пытаюсь извлечь граф сети из omnet ++ и передать информацию об узлах и ссылки на граф Лимона. С частью проблемы легко разобраться. Используя код:

    cTopology *topo = new cTopology("topo");
std::vector<std::string> nedTypes;
nedTypes.push_back("inet.node.inet.StandardHost");
topo->extractByNedTypeName(nedTypes);
int numNodes = topo->getNumNodes();
EV << "cTopology found " << topo->getNumNodes() << " nodes\n";

ListDigraph g;
ListDigraph::NodeMap<std::string> nodeName(g);

for (ListDigraph::NodeIt n(g); n != INVALID; ++n)
{
int i = 0;//counter
int numOutLinks =  topo->getNode(i)->getNumOutLinks();
g.addNode();
std::vector<std::string> nodeList;

nodeName[n] = topo->getNode(i)->getModule()->getName();
nodeList.push_back(nodeName[n]);

for(int j = 0; j<numOutLinks; j++)
{
cTopology::LinkOut* lOut = topo->getNode(i)->getLinkOut(j);
cTopology::Node *rNode = lOut->getRemoteNode();
for (auto& nlist : nodeList)
{
auto nodeFound = std::find(std::begin(nlist), std::end(nlist), rNode);
if(nodeFound != std::end(nlist)){
g.addNode();
g.addArc(g.nodeFromId(i), g.nodeFromId(i+1));
}
}
} i++;

Каким-то образом я получаю список узлов, и теперь я пытаюсь также получить информацию о ссылке. То есть узлы и связи между ними. Как получить информацию о ссылках и передать ее в граф Лимона, и что не так в подходе, который я использовал в коде?

0

Решение

Метод extractByNedTypeName() требуется полное имя типа NED, то есть пакет. В INET StandardHost обычно в упаковке inet.node.inetПоэтому вы должны написать:

nedTypes.push_back("inet.node.inet.StandardHost");

РЕДАКТИРОВАТЬ
Петля for (ListDigraph::NodeIt n(g); n != INVALID; ++n) никогда не выполняется, потому что граф g только что создан и пуст. Внешний цикл должен быть примерно таким:
for(int j = 0; j<numOutLinks; j++),

EDIT2
Из-за отсутствия find за NodeMap нужно написать собственную функцию, например:

ListDigraph::NodeIt::Node findNodeMap(const ListDigraph::NodeMap<std::string> & map, const ListDigraph & g,
std::string txt) {
ListDigraph::NodeIt it(g);
for (; it != INVALID; ++it) {
if (map[it] == txt)
break;
}
return it;
}

Пример использования этого:

ListDigraph::NodeMap<std::string> nodeName(g);
// ... filling nodeName
std::string str = "node1";
ListDigraph::NodeIt::Node node = findNodeMap(nodeName, g, str);
if (node != INVALID) {
// node with name from str was found
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]