// 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.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 EM2LowerBound implements GraphReportExtension {
public String getName() {
return "EM2 Lower";
}
public String getDescription() {
return "EM2 Lower";
}
public Object calculate(GraphModel g) {
ZagrebIndexFunctions zif = new ZagrebIndexFunctions(g);
ZagrebIndexFunctions zifL = new ZagrebIndexFunctions(
Utils.createLineGraph(g)
);
RenderTable ret = new RenderTable();
Vector<String> titles = new Vector<>();
titles.add(" EM2(G) ");
titles.add("Psi1");
titles.add("Psi2");
titles.add("My1");
titles.add("My2");
titles.add("N2");
titles.add("N1");
ret.setTitles(titles);
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 M31 = zif.getFirstZagreb(2);
double M41 = zif.getFirstZagreb(3);
double M22 = zif.getSecondZagreb(2);
double Mm31 = zif.getFirstZagreb(-4);
double Mm11 = zif.getFirstZagreb(-2);
double EM1 = zifL.getFirstZagreb(1);
double EM2 = zifL.getSecondZagreb(1);
double D12 = ((EM2 - (M41 / 2) + (3 * M31 / 2) - M21) / 2);
double K13 = ((M31 - (3 * M21) + (4 * m)) / 6);
double K14 = ((M41 - (6 * M31) + (11 * M21) - (12 * m)) / 24);
double Psi1 = (Math.pow((2 * (m + 1) - (n + maxDeg + maxDeg2)
+ Math.sqrt((2 * m - maxDeg - maxDeg2)
* (Mm11 - ((1 / maxDeg) + (1 / maxDeg2))))), 2) / (n - 2));
double Psi2 = (Math.pow((2 * (m + 1) - (n + maxDeg + minDeg)
+ Math.sqrt((2 * m - maxDeg - minDeg)
* (Mm11 - ((1 / maxDeg) + (1 / minDeg))))), 2) / (n - 2));
Vector<Object> v = new Vector<>();
v.add(zifL.getSecondZagreb(1));
//Psi1
v.add((2 * D12) + (12 * K14) + (15 * K13) - M31 + (3 * maxDeg * maxDeg)
+ (3 * maxDeg2 * maxDeg2) + (3 * Psi1) - (4 * m));
//Psi1
v.add((2 * D12) + (12 * K14) + (15 * K13) - M31 + (3 * maxDeg * maxDeg)
+ (3 * minDeg * minDeg) + (3 * Psi2) - (4 * m));
//My new1
v.add((2 * D12) + ((M31 * M31) / (2 * M21)) - (3 * M31 / 2) + M21);
//My new1
v.add((2 * D12) + ((M21 * M21) / (2 * m)) - (3 * M31 / 2) + M21);
//nilanjan de 2
v.add(Math.pow(M21 - (2 * m), 2) / (2 * m * m));
//nilanjan de 1
v.add(2 * (M21 - (2 * m)) * (minDeg - 1) * (minDeg - 1));
//nilanjan de 0
v.add(EM1 * (minDeg - 1));
ret.add(v);
return ret;
}
@Override
public String getCategory() {
return "Topological Indices-Conjectures";
}
}