// 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.energy; import Jama.EigenvalueDecomposition; import Jama.Matrix; import graphtea.extensions.Utils; import graphtea.extensions.reports.zagreb.ZagrebIndexFunctions; 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.Arrays; import java.util.Collections; import java.util.Vector; /** * @author Ali Rostami */ @CommandAttitude(name = "newInvs", abbreviation = "_newInv") public class NewLowerBounds implements GraphReportExtension{ public String getName() { return "Lower Bounds"; } public String getDescription() { return "Lower Bounds"; } public Object calculate(GraphModel g) { ZagrebIndexFunctions zif = new ZagrebIndexFunctions(g); RenderTable ret = new RenderTable(); Vector<String> titles = new Vector<>(); titles.add(" E(G) "); titles.add(" 1.1 "); titles.add(" 1.2 "); titles.add(" 1.3 "); titles.add(" 1.4 "); titles.add(" 1.5 "); titles.add(" 1.6 "); titles.add(" 1.7 "); titles.add(" Eigenvalues "); titles.add(" 2-degree sum "); titles.add("new query"); ret.setTitles(titles); Matrix A = g.getWeightedAdjacencyMatrix(); EigenvalueDecomposition ed = A.eig(); double rv[] = ed.getRealEigenvalues(); double sum=0; double detA = Math.abs(A.det()); //positiv RV Double[] prv = new Double[rv.length]; for(int i=0;i<rv.length;i++) { prv[i] = Math.abs(rv[i]); prv[i] = (double)Math.round(prv[i] * 100000d) / 100000d; sum += prv[i]; } Arrays.sort(prv, Collections.reverseOrder()); double maxDeg = 0; double maxDeg2 = 0; double minDeg = Integer.MAX_VALUE; 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; for(Vertex v : g) { if(g.getDegree(v)==maxDeg) a++; if(g.getDegree(v)==minDeg) b++; } if(maxDeg==minDeg) b=0; double m = g.getEdgesCount(); double n = g.getVerticesCount(); double M12=zif.getSecondZagreb(1); double M21=zif.getFirstZagreb(1); double M22=zif.getSecondZagreb(2); double Mm11=zif.getFirstZagreb(-2); Vector<Object> v = new Vector<>(); v.add(sum); //1 v.add(Math.sqrt(2*m)); //2 v.add((2*Math.sqrt(2*m*n)*Math.sqrt(prv[0]*prv[prv.length-1])) /(prv[0] + prv[prv.length-1])); //3 v.add((prv[0]*prv[prv.length-1]*n + 2*m)/(prv[0] + prv[prv.length-1])); //4 v.add(Math.sqrt(2*m*n - (Math.pow(n*(prv[0]-prv[prv.length-1]),2)/4))); //5 double alpha=n*Math.floor(n/2)*(1-(1/n)*Math.floor(n/2)); v.add(Math.sqrt(2*m*n - (Math.pow((prv[0]-prv[prv.length-1]),2)*alpha))); //6 if(detA==0) v.add(0); else v.add(Math.sqrt(2*m + n*(n-1)*Math.pow(detA,2/n))); //7 double up=n*Math.pow(prv[0]-prv[prv.length-1],2); double down=4*(prv[0] + prv[prv.length-1]); v.add(Math.sqrt(2*m*n) - (up/down)); //eigenvalues v.add(getEigenValues(g)); //2-degree sum v.add(Utils.getDegreeSum(g,1)); // new query double eigenVal_k=prv[prv.length-1]; int cnt = prv.length-1; if(eigenVal_k==0) { while(eigenVal_k==0) { eigenVal_k=prv[--cnt]; } } int numOfNZEigenValue = 0; for(int i=0;i<prv.length;i++) { if(prv[i] != 0) numOfNZEigenValue++; } double alpha_k=numOfNZEigenValue*Math.floor(numOfNZEigenValue/2) *(1-(1/numOfNZEigenValue)*Math.floor(numOfNZEigenValue/2)); System.out.println(alpha_k + " " + numOfNZEigenValue); System.out.println(prv[0] + " " + eigenVal_k); v.add(Math.sqrt(2*m*numOfNZEigenValue - (Math.pow((prv[0]-eigenVal_k),2)*alpha_k))); ret.add(v); return ret; } public static String getEigenValues(GraphModel g) { Matrix A = g.getWeightedAdjacencyMatrix(); EigenvalueDecomposition ed = A.eig(); double rv[] = ed.getRealEigenvalues(); double iv[] = ed.getImagEigenvalues(); String res = ""; for (int i = 0; i < rv.length; i++) { if (iv[i] != 0) res +="" + round(rv[i], 3) + " + " + round(iv[i], 3) + "i"; else res += "" + round(rv[i], 3); if(i!=rv.length-1) { res += ","; } } return res; } static double round(double value, int decimalPlace) { double power_of_ten = 1; while (decimalPlace-- > 0) power_of_ten *= 10.0; return Math.round(value * power_of_ten) / power_of_ten; } @Override public String getCategory() { return "Graph Energy"; } }