// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.extensions.reports.zagreb;
import graphtea.extensions.Utils;
import graphtea.extensions.reports.DijkstraNonNegative;
import graphtea.extensions.reports.basicreports.NumOfVerticesWithDegK;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.RenderTable;
import graphtea.graph.graph.Vertex;
import graphtea.platform.lang.CommandAttitude;
import graphtea.plugins.main.core.AlgorithmUtils;
import graphtea.plugins.reports.extension.GraphReportExtension;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Vector;
/**
* @author Ali Rostami
*/
@CommandAttitude(name = "m3finalconj", abbreviation = "_m3conj")
public class BalabanIndex implements GraphReportExtension{
public String getName() {
return "Balaban Index";
}
public String getDescription() {
return "Balaban Index";
}
public Object calculate(GraphModel g) {
RenderTable ret = new RenderTable();
Vector<String> titles = new Vector<>();
titles.add(" Balaban Index ");
double maxDeg = 0;
double maxDeg2 = 0;
double minDeg = Integer.MAX_VALUE;
double minDeg2 = Utils.getMinNonPendentDegree(g);
ArrayList<Integer> al = AlgorithmUtils.getDegreesList(g);
Collections.sort(al);
maxDeg = al.get(al.size()-1);
if(al.size()-2>=0) maxDeg2 = al.get(al.size()-2);
else maxDeg2 = maxDeg;
minDeg = al.get(0);
if(maxDeg2 == 0) maxDeg2=maxDeg;
double a=0;
double b=0;
double c=0;
double d=0;
int p = NumOfVerticesWithDegK.numOfVerticesWithDegK(g, 1);
for(Vertex v : g) {
if(g.getDegree(v)==maxDeg) a++;
if(g.getDegree(v)==minDeg) b++;
if(g.getDegree(v)==maxDeg2) c++;
if(g.getDegree(v)==minDeg2) d++;
}
if(maxDeg==minDeg) b=0;
if(maxDeg==maxDeg2) c=0;
double m = g.getEdgesCount();
double n = g.getVerticesCount();
Vector<Object> v = new Vector<>();
double tmp = m/(m-n+2.);
double allSum = 0;
for(Vertex fV : g) {
for(Vertex sV : g) {
if(g.isEdge(fV,sV)) {
DijkstraNonNegative.dijkstra(g,sV);
double sum1 = 0;
for(Vertex temp : g) sum1+=(Double)temp.getUserDefinedAttribute(DijkstraNonNegative.Dist);
DijkstraNonNegative.dijkstra(g,fV);
double sum2 = 0;
for(Vertex temp : g) sum2+=(Double)temp.getUserDefinedAttribute(DijkstraNonNegative.Dist);
allSum += 1/Math.sqrt(sum1*sum2);
}
}
}
v.add(tmp*allSum);
ret.setTitles(titles);
ret.add(v);
return ret;
}
@Override
public String getCategory() {
// TODO Auto-generated method stub
return "Topological Indices";
}
}