// GraphTea Project:bvb 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.reports.zagreb.ZagrebIndexFunctions; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.RenderTable; import graphtea.graph.graph.Vertex; import graphtea.library.util.Complex; 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; import static graphtea.extensions.Utils.getLaplacian; /** * @author Ali Rostami */ @CommandAttitude(name = "newInvs", abbreviation = "_newInv") public class UpperBounds implements GraphReportExtension { public String getName() { return "Upper Bounds"; } public String getDescription() { return "Upper Bounds"; } public Object calculate(GraphModel g) { ZagrebIndexFunctions zif = new ZagrebIndexFunctions(g); RenderTable ret = new RenderTable(); Vector<String> titles = new Vector<>(); titles.add(" Laplacian Energy "); titles.add("m "); titles.add("n "); ret.setTitles(titles); Matrix A = g.getWeightedAdjacencyMatrix(); EigenvalueDecomposition ed = A.eig(); double rv[] = ed.getRealEigenvalues(); double sum = 0; //positiv RV Double[] prv = new Double[rv.length]; for (int i = 0; i < rv.length; i++) { prv[i] = Math.abs(rv[i]); 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<>(); String tmp = calc(g).toString(); if(Double.parseDouble(tmp) == 16) System.out.println("salam " + tmp); v.add(Double.parseDouble(tmp)); v.add(m); v.add(n); //1 // v.add(Math.sqrt(2 * m * n)); //2 // v.add(prv[0] // + Math.sqrt((n - 1) * (2 * m - Math.pow(prv[0], 2)))); //3 // v.add(n * Math.sqrt(M21 / (2 * m))); //4 // double up = (n - 1) * Math.sqrt((M21 - maxDeg * maxDeg) * (2 * m - prv[0] * prv[0])); // double down = 2 * m - maxDeg; // v.add(prv[0] + up / down); //5 // double tmp = Math.sqrt((n - 1) * (2 * m - Math.pow(prv[0], 2)) // + (Math.pow(n - 2, 2) / (n - 1)) * Math.pow(prv[1] - prv[prv.length - 1], 2)); // v.add(prv[0] + tmp); //6 // tmp = Math.sqrt((n - 1) * (2 * m - Math.pow(prv[0], 2)) // + (((n - 2) * 2) / (n - 1)) * Math.pow(prv[1] - prv[prv.length - 1], 2)); // // v.add(prv[0] + tmp); //Laplacian Energy // v.add(sum); // v.add((2*m/n) + ((2/(n-1))*(Math.sqrt(((n-1)*((2*m) + M21)) - (4*m*m) ) )) ); // v.add(Math.sqrt((2/(n-1))*(((n-1)*((2*m) + M21)) - (4*m*m) ) ) ); // v.add((2*m/n) + ((2/(n-1))*(Math.sqrt( (2*m*((n*(n-1) - (2*m)) )) / n ) )) ); ret.add(v); return ret; } 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() { // TODO Auto-generated method stub return "Graph Energy"; } public Object calc(GraphModel g) { double m = g.getEdgesCount(); double n = g.getVerticesCount(); double power = 1; try { Matrix A = g.getWeightedAdjacencyMatrix(); A = getLaplacian(A); EigenvalueDecomposition ed = A.eig(); double rv[] = ed.getRealEigenvalues(); double iv[] = ed.getImagEigenvalues(); double maxrv = 0; double minrv = 1000000; for (double value : rv) { double tval = Math.abs(value); if (maxrv < tval) maxrv = tval; if (minrv > tval) minrv = tval; } double sum = 0; double sum_i = 0; for (int i = 0; i < rv.length; i++) sum += Math.pow(Math.abs(rv[i] - (2*m/n)), power); for (int i = 0; i < iv.length; i++) sum_i += Math.abs(iv[i]); if (sum_i != 0) { sum_i = 0; Complex num = new Complex(0, 0); for (int i = 0; i < iv.length; i++) { Complex tmp = new Complex(rv[i], iv[i]); tmp.pow(new Complex(power, 0)); num.plus(tmp); } return "" + round(num.re(), 5) + " + " + round(num.im(), 5) + "i"; } else { return "" + round(sum, 5); } } catch (Exception e) { } return null; } }