/* * BoostGraphCreator_impl.hpp * * Created on: May 18, 2017 * Author: heber */ #ifndef GRAPH_BOOSTGRAPHCREATOR_IMPL_HPP_ #define GRAPH_BOOSTGRAPHCREATOR_IMPL_HPP_ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "BoostGraphCreator.hpp" #include "CodePatterns/Assert.hpp" #include "CodePatterns/Log.hpp" #include "Atom/atom.hpp" #include "Bond/bond.hpp" template void BoostGraphCreator::createFromRange( const iterator &_begin, const iterator &_end, const size_t &_no_nodes, const predicate_t &_pred ) { graph = UndirectedGraph(); // add vertices for(iterator iter = _begin; iter != _end; ++iter) { const atomId_t atomid = (*iter)->getId(); Vertex v = boost::add_vertex(atomid, graph); const atomId_t vertexname = boost::get(boost::get(boost::vertex_name, graph), v); const nodeId_t vertexindex = boost::get(boost::get(boost::vertex_index, graph), v); LOG(2, "DEBUG: Adding node " << vertexindex << " associated to atom #" << vertexname); ASSERT( vertexname == atomid, "BoostGraphCreator::createFromRange() - atomid "+toString(atomid) +" is not name of vertex "+toString(vertexname)+"."); atomids_nodeids.insert( std::make_pair(vertexname, vertexindex) ); } // add edges for(iterator iter = _begin; iter != _end; ++iter) { LOG(2, "DEBUG: Looking at atom " << (*iter)->getId()); const BondList& ListOfBonds = (*iter)->getListOfBonds(); for(BondList::const_iterator bonditer = ListOfBonds.begin(); bonditer != ListOfBonds.end(); ++bonditer) { LOG(2, "DEBUG: Looking at bond " << *(*bonditer)); const atomId_t leftid = (*bonditer)->leftatom->getId(); const nodeId_t leftnodeid = getNodeId(leftid); const atomId_t rightid = (*bonditer)->rightatom->getId(); const nodeId_t rightnodeid = getNodeId(rightid); // only pick each bond once and evaluate predicate if ((leftid == (*iter)->getId()) && (_pred(**bonditer))) { LOG(3, "DEBUG: ADDING edge " << leftnodeid << " <-> " << rightnodeid); boost::add_edge(leftnodeid, rightnodeid, graph); } else { LOG(3, "DEBUG: Discarding edge " << leftnodeid << " <-> " << rightnodeid); } } } LOG(2, "DEBUG: We have " << getNumVertices() << " nodes and " << getNumEdges() << " edges in the molecule graph."); } #endif /* GRAPH_BOOSTGRAPHCREATOR_IMPL_HPP_ */