/** * remove a node from the graph, ignoring edges (as a prepost all edges connecting to this node should be already removed) */ void GraphX::removeNode_IgnoreEdges(int nodeID) { CL.clear(); nodesByLabel.find(getNodeWithID(nodeID)->getLabel())->second->erase(nodeID); delete nodes.find(nodeID)->second; nodes.erase(nodeID); }
/** This method permits the user to get the unnormalized log likelihood * of the graph given a certain assignation to all its nodes. * \param classes: Classes assignation to all the nodes. * \return Unnormalized log likelihood. */ double getUnnormalizedLogLikelihood( std::map<size_t,size_t> &classes, bool debug = false ) { DEBUG("Computing likelihood..."); double unlikelihood = 0; //size_t N_nodes = m_nodes.size(); size_t N_edges = m_edges.size(); std::map<size_t,size_t>::iterator it; DEBUG("Computing nodes likelihood..."); for ( it = classes.begin(); it != classes.end(); it++ ) { CNodePtr node = getNodeWithID( it->first ); //unlikelihood *= node->getPotentials()(classes[node->getID()]); unlikelihood += node->getPotentials()(it->second); } DEBUG("Computing edges likelihood..."); for ( size_t index = 0; index < N_edges; index++ ) { CEdgePtr edge = m_edges[index]; CNodePtr n1, n2; edge->getNodes(n1,n2); size_t ID1 = n1->getID(); size_t ID2 = n2->getID(); size_t IDNodeType1 = n1->getType()->getID(); size_t IDNodeType2 = n2->getType()->getID(); // Check if the nodes share the same type. if ( IDNodeType1 == IDNodeType2 ) // If they do, then the node with the lower id is the one appearing // first in the edge; if ( ID1 > ID2 ) //unlikelihood *= edge->getPotentials()(classes[ID2],classes[ID1]); unlikelihood += std::log(edge->getPotentials()(classes[ID2],classes[ID1])); else unlikelihood += std::log(edge->getPotentials()(classes[ID1],classes[ID2])); else // If not, the node with the lower nodeType is the first if ( IDNodeType1 > IDNodeType2 ) unlikelihood += std::log(edge->getPotentials()(classes[ID2],classes[ID1])); else unlikelihood += std::log(edge->getPotentials()(classes[ID1],classes[ID2])); } //unlikelihood = std::log( unlikelihood ); DEBUG("Done."); return unlikelihood; }