#include "StrengthMetric.h" METRICPLUGIN(StrengthMetric,"Strength","David Auber","26/02/2003","Alpha","0","1"); using namespace std; StrengthMetric::StrengthMetric(PropertyContext *context):Metric(context) {} StrengthMetric::~StrengthMetric() {} double StrengthMetric::e(set &U,set &V) { set::const_iterator itU; double result=0; for (itU=U.begin();itU!=U.end();++itU) { Iterator *itN=superGraph->getInOutNodes(*itU); for (;itN->hasNext();) { node itn=itN->next(); if (V.find(itn)!=V.end()) result+=1; }delete itN; } return result; } double StrengthMetric::e(set &U) { set::const_iterator itU; double result=0; for (itU=U.begin();itU!=U.end();++itU) { Iterator *itN=superGraph->getInOutNodes(*itU); for (;itN->hasNext();) { node itn=itN->next(); if (U.find(itn)!=U.end()) result+=1; }delete itN; } return result/2; } double StrengthMetric::s(set &U,set &V) { if ((U.size()==0) || (V.size()==0)) return 0; return (e(U,V) / (U.size()*V.size())); } double StrengthMetric::s(set &U) { if (U.size()<2) return 0; return (e(U)) * 2 / (U.size()*(U.size()-1)); } double StrengthMetric::getEdgeValue(const edge e ) { node u=superGraph->source(e); node v=superGraph->target(e); set Nu,Nv,Wuv,Mu,Mv; //Compute Nu Iterator *itN=superGraph->getInOutNodes(u); for (;itN->hasNext();) { node n=itN->next(); if (n!=v) Nu.insert(n); }delete itN; //Compute Nv itN=superGraph->getInOutNodes(v); for (;itN->hasNext();) { node n=itN->next(); if (n!=u) Nv.insert(n); }delete itN; //Compute Wuv set::const_iterator itNu; for (itNu=Nu.begin();itNu!=Nu.end();++itNu) { if (Nv.find(*itNu)!=Nv.end()) Wuv.insert(*itNu); } //Compute Mu, this implementation is not optimal, should use stl operations for (itNu=Nu.begin();itNu!=Nu.end();++itNu) { if (Wuv.find(*itNu)==Wuv.end()) Mu.insert(*itNu); } //Compute Mv, this implementation is not optimal set::const_iterator itNv; for (itNv=Nv.begin();itNv!=Nv.end();++itNv) { if (Wuv.find(*itNv)==Wuv.end()) Mv.insert(*itNv); } //compute strength metric double gamma4,gamma3; if ( (Mu.size() == 0) && (Mv.size()==0) && Wuv.size()==0) gamma3=0; else gamma3=Wuv.size()/(Wuv.size()+Mv.size()+Mu.size()); gamma4=s(Mu,Wuv)+s(Mv,Wuv)+s(Mu,Mv)+s(Wuv); return gamma3+gamma4; } double StrengthMetric::getNodeValue(const node n ) { // cerr << __PRETTY_FUNCTION__ << endl; if (superGraph->deg(n)==0) return 0; double result=0; Iterator *itE=superGraph->getInOutEdges(n); for (;itE->hasNext();) { edge ite=itE->next(); result+=metricProxy->getEdgeValue(ite); }delete itE; return result/superGraph->deg(n); } bool StrengthMetric::run() { return true; }