// 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 M3Final implements GraphReportExtension{
public String getName() {
return "M3 Final";
}
public String getDescription() {
return "M3 Final";
}
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(" M^3_1(G) ");
titles.add("1 ");
titles.add("2");
titles.add("3");
titles.add("4");
titles.add("5");
titles.add("6");
titles.add("7 ");
titles.add("8");
titles.add("9");
titles.add("10");
titles.add("11");
titles.add("12");
titles.add("13");
titles.add("14");
titles.add("15");
titles.add("16");
titles.add("BF");
titles.add("Bf-");
titles.add("Il");
titles.add("Zh");
titles.add("3.16");
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);
Vector<Object> v = new Vector<>();
v.add(zif.getFirstZagreb(2));
//new1+-----------
v.add(maxDeg * maxDeg * maxDeg + maxDeg2 * maxDeg2 * maxDeg2
+ 2 * m - maxDeg - maxDeg2
+ (M21 - maxDeg * maxDeg - maxDeg2 * maxDeg2 - n + 2)
* (M21 - maxDeg * maxDeg - maxDeg2 * maxDeg2 - n + 2)
/ (2 * m - maxDeg - maxDeg2 - Mm11 + (1 / maxDeg) + (1 / maxDeg2)));
//new2
v.add((maxDeg * maxDeg * maxDeg) + (minDeg * minDeg * minDeg) + 2 * m - (maxDeg) - (minDeg) + Math.pow((M21 - (maxDeg * maxDeg) - (minDeg * minDeg) - (n - 2)), 2) / (2 * m - maxDeg - minDeg - Mm11 + (1 / maxDeg) + (1 / minDeg)));
//new3
v.add(maxDeg * maxDeg * maxDeg + maxDeg2 * maxDeg2 * maxDeg2 + M21 - maxDeg * maxDeg - maxDeg2 * maxDeg2 + (Math.pow((M21 - maxDeg * maxDeg - maxDeg2 * maxDeg2 - 2 * m + maxDeg + maxDeg2), 2) / (2 * m - maxDeg - maxDeg2 - n + 2)));
//new4
v.add(maxDeg * maxDeg * maxDeg + minDeg * minDeg * minDeg + M21 - maxDeg * maxDeg - minDeg * minDeg + (Math.pow((M21 - maxDeg * maxDeg - minDeg * minDeg - 2 * m + maxDeg + minDeg), 2) / (2 * m - maxDeg - minDeg - n + 2)));
//M1new1
v.add((M31 - (3 * M21) + 4 * m) - (4 * m) + 3 * maxDeg * maxDeg +
3 * maxDeg2 * maxDeg2
+ 3 * (Math.pow((2 * (m + 1) - (n + maxDeg + maxDeg2)
+ Math.sqrt((2 * m - maxDeg - maxDeg2)
* (Mm11 - ((1 / maxDeg) + (1 / maxDeg2))))), 2) / (n - 2)));
//M1New2
v.add((M31 - (3 * M21) + 4 * m) - (4 * m) + 3 * maxDeg * maxDeg +
3 * minDeg * minDeg
+ 3 * (Math.pow((2 * (m + 1) - (n + maxDeg + minDeg)
+ Math.sqrt((2 * m - maxDeg - minDeg)
* (Mm11 - ((1 / maxDeg) + (1 / minDeg))))), 2) / (n - 2)));
//M1New3
v.add((M31 - (3 * M21) + 4 * m) - (4 * m) + 3 * maxDeg * maxDeg +
3 * maxDeg2 * maxDeg2 +
(3 * (2 * m - maxDeg - maxDeg2) * (2 * m - maxDeg - maxDeg2) / (n - 2)) +
(3 * ((2 * m - maxDeg - maxDeg2) * (Mm11 - (1 / maxDeg) - (1 / maxDeg2))) / (n - 2)) - 3 * (n - 2));
//M1New4
v.add((M31 - (3 * M21) + 4 * m) - (4 * m) + 3 * maxDeg * maxDeg +
3 * minDeg * minDeg +
(3 * (2 * m - maxDeg - minDeg) * (2 * m - maxDeg - minDeg) / (n - 2)) +
(3 * ((2 * m - maxDeg - minDeg) * (Mm11 - (1 / maxDeg) - (1 / minDeg))) / (n - 2)) - 3 * (n - 2));
//1max
v.add((maxDeg * maxDeg * maxDeg) + (maxDeg2 * maxDeg2 * maxDeg2) + (Math.pow((M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2)) + Math.sqrt((n - 2) * (M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2))) - (2 * m - maxDeg - maxDeg2), 2) / (2 * m - maxDeg - maxDeg2)));
//1min
v.add((maxDeg * maxDeg * maxDeg) + (minDeg * minDeg * minDeg) + (Math.pow((M21 - (maxDeg * maxDeg) - (minDeg * minDeg)) + Math.sqrt((n - 2) * (M21 - (maxDeg * maxDeg) - (minDeg * minDeg))) - (2 * m - maxDeg - minDeg), 2) / (2 * m - maxDeg - minDeg)));
//2max
v.add((maxDeg * maxDeg * maxDeg) + (maxDeg2 * maxDeg2 * maxDeg2) + (Math.pow((M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2)) + Math.sqrt((2 * m - maxDeg - maxDeg2) * (Mm11 - (1 / maxDeg) - (1 / maxDeg2))) - (n - 2), 2) / (2 * m - maxDeg - maxDeg2)));
//2min
v.add((maxDeg * maxDeg * maxDeg) + (minDeg * minDeg * minDeg) + (Math.pow((M21 - (maxDeg * maxDeg) - (minDeg * minDeg)) + Math.sqrt((2 * m - maxDeg - minDeg) * (Mm11 - (1 / maxDeg) - (1 / minDeg))) - (n - 2), 2) / (2 * m - maxDeg - minDeg)));
//3max
v.add(((maxDeg * maxDeg * maxDeg) + (maxDeg2 * maxDeg2 * maxDeg2) - (2 * m - maxDeg - maxDeg2)) + ((((M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2)) * (M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2))) + ((n - 2) * (M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2))))) / (2 * m - maxDeg - maxDeg2));
//3min
v.add(((maxDeg * maxDeg * maxDeg) + (minDeg * minDeg * minDeg) - (2 * m - maxDeg - minDeg)) + ((((M21 - (maxDeg * maxDeg) - (minDeg * minDeg)) * (M21 - (maxDeg * maxDeg) - (minDeg * minDeg))) + ((n - 2) * (M21 - (maxDeg * maxDeg) - (minDeg * minDeg))))) / (2 * m - maxDeg - minDeg));
//4max
v.add(((maxDeg * maxDeg * maxDeg) + (maxDeg2 * maxDeg2 * maxDeg2)) + ((((M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2)) * (M21 - (maxDeg * maxDeg) - (maxDeg2 * maxDeg2))) + ((2 * m - maxDeg - maxDeg2) * (Mm11 - (1 / maxDeg) - (1 / maxDeg2))) - ((n - 2) * (n - 2))) / (2 * m - maxDeg - maxDeg2)));
//4min
v.add(((maxDeg * maxDeg * maxDeg) + (minDeg * minDeg * minDeg))
+ ((((M21 - (maxDeg * maxDeg) - (minDeg * minDeg))
* ((M21 - (maxDeg * maxDeg) - (minDeg * minDeg))))
+ ((2 * m - maxDeg - minDeg) * (Mm11 - (1 / maxDeg)
- (1 / minDeg))) - ((n - 2) * (n - 2))) / (2 * m - maxDeg - minDeg)));
//BF
v.add((M21 * M21) / (2 * m));
//BF-
v.add(((M21 * M21) / (m)) - (2 * M12));
//Ilic
v.add((2 * m * M21) / n);
//Zhou
v.add(16 * ((m * m * m) / (n * n)) - (2 * M12));
//3.16
v.add(zifL.getFirstZagreb(1)
+ 4 * zif.getFirstZagreb(1)
- 2 * zif.getSecondZagreb(1) - 4 * m);
ret.add(v);
return ret;
}
@Override
public String getCategory() {
return "Topological Indices-Conjectures";
}
}