Example #1
0
void HyperDijkstra::visitAdjacencyMap(AdjacencyMap& amap, TreeAction* action, bool useDistance)
{

    typedef std::deque<HyperGraph::Vertex*> Deque;
    Deque q;
    // scans for the vertices without the parent (whcih are the roots of the trees) and applies the action to them.
    for (AdjacencyMap::iterator it=amap.begin(); it!=amap.end(); ++it) {
        AdjacencyMapEntry& entry(it->second);
        if (! entry.parent()) {
            action->perform(it->first,0,0);
            q.push_back(it->first);
        }
    }

    //std::cerr << "q.size()" << q.size() << endl;
    int count=0;
    while (! q.empty()) {
        HyperGraph::Vertex* parent=q.front();
        q.pop_front();
        ++count;
        AdjacencyMap::iterator parentIt=amap.find(parent);
        if (parentIt==amap.end()) {
            continue;
        }
        //cerr << "parent= " << parent << " parent id= " << parent->id() << "\t children id =";
        HyperGraph::VertexSet& childs(parentIt->second.children());
        for (HyperGraph::VertexSet::iterator childsIt=childs.begin(); childsIt!=childs.end(); ++childsIt) {
            HyperGraph::Vertex* child=*childsIt;
            //cerr << child->id();
            AdjacencyMap::iterator adjacencyIt=amap.find(child);
            assert (adjacencyIt!=amap.end());
            HyperGraph::Edge* edge=adjacencyIt->second.edge();

            assert(adjacencyIt->first==child);
            assert(adjacencyIt->second.child()==child);
            assert(adjacencyIt->second.parent()==parent);
            if (! useDistance) {
                action->perform(child, parent, edge);
            } else {
                action->perform(child, parent, edge, adjacencyIt->second.distance());
            }
            q.push_back(child);
        }
        //cerr << endl;
    }

}
Example #2
0
bool CAdjacencyList::m_CompareAdjacencyMaps( AdjacencyMap& toCompareAdjacencyMap )
{
	bool adjacencyMapsEqual = true;
	unsigned int adjacencyMapSize = m_adjacencyMap.size();
	auto adjacencyMapIteratorToCompare = toCompareAdjacencyMap.begin();
	auto adjacencyMapIterator = m_adjacencyMap.begin();
	
	for ( unsigned int adajcencyMapIndex = 0; adajcencyMapIndex < adjacencyMapSize; ++adajcencyMapIndex, ++adjacencyMapIteratorToCompare, ++adjacencyMapIterator )
	{
		bool equalInside = ( ( adjacencyMapIteratorToCompare->first ) == ( adjacencyMapIterator->first ) );
		equalInside = equalInside && ( ( adjacencyMapIteratorToCompare->second.size() ) == ( adjacencyMapIterator->second.size() ) );
		if ( equalInside )
		{
			for ( unsigned int edgesVectorIndex = 0; edgesVectorIndex < adjacencyMapIterator->second.size(); ++edgesVectorIndex )
			{
				try
				{
					equalInside = equalInside && ( ( adjacencyMapIteratorToCompare->second.at(edgesVectorIndex).first ) == 
						( adjacencyMapIterator->second.at(edgesVectorIndex).first ) );
					equalInside = equalInside && ( ( adjacencyMapIteratorToCompare->second.at(edgesVectorIndex).second ) == 
						( adjacencyMapIterator->second.at(edgesVectorIndex).second ) );
					if ( !equalInside )
					{
						adjacencyMapsEqual = false;
					}
				}
				catch( ... )
				{
					//NOPE
					return adjacencyMapsEqual;
				}
			}
		}
	}
	return adjacencyMapsEqual;
}
Example #3
0
void HyperDijkstra::computeTree(AdjacencyMap& amap)
{
    for (AdjacencyMap::iterator it=amap.begin(); it!=amap.end(); ++it) {
        AdjacencyMapEntry& entry(it->second);
        entry._children.clear();
    }
    for (AdjacencyMap::iterator it=amap.begin(); it!=amap.end(); ++it) {
        AdjacencyMapEntry& entry(it->second);
        HyperGraph::Vertex* parent=entry.parent();
        if (!parent) {
            continue;
        }
        HyperGraph::Vertex* v=entry.child();
        assert (v==it->first);

        AdjacencyMap::iterator pt=amap.find(parent);
        assert(pt!=amap.end());
        pt->second._children.insert(v);
    }
}