package graphtea.extensions.reports.zagreb;
import graphtea.extensions.Utils;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.Vertex;
import graphtea.library.algorithms.util.LibraryUtils;
import java.util.ArrayList;
/**
* Created by rostam on 27.01.15.
* Class containg the functions for computation of Zagreb indices
*/
public class ZagrebIndexFunctions {
GraphModel g;
public ZagrebIndexFunctions(GraphModel g) {
this.g = g;
}
public double getInverseSumIndegIndex() {
double ret = 0;
for(Edge e : g.getEdges()) {
ret += (g.getDegree(e.source)*g.getDegree(e.target)*1.0)
/(g.getDegree(e.source) + g.getDegree(e.target));
}
return ret;
}
public double getEdgeDegree(double alpha) {
double edge_degree = 0;
for (Edge e : g.getEdges()) {
edge_degree +=
Math.pow(
g.getDegree(e.source) +
g.getDegree(e.target) - 2, alpha);
}
return edge_degree;
}
public double getHyperZagrebIndex() {
double hz = 0;
for(Edge e : g.getEdges()) {
hz += Math.pow(
g.getDegree(e.source) + g.getDegree(e.target)
,2);
}
return hz;
}
public double getFirstZagreb(double alpha) {
double first_zagreb = 0;
for (Vertex v : g.vertices()) {
first_zagreb += Math.pow(g.getDegree(v), alpha + 1);
}
return first_zagreb;
}
public double getThirdZagreb() {
double ret = 0;
for (Edge e : g.getEdges()) {
ret += Math.abs(g.getDegree(e.source) -
g.getDegree(e.target));
}
return ret;
}
public double getSecondZagreb(double alpha) {
double second_zagreb = 0;
for (Edge e : g.getEdges()) {
second_zagreb +=
Math.pow(
g.getDegree(e.source) *
g.getDegree(e.target), alpha);
}
return second_zagreb;
}
public double getFirstReZagreb(double alpha) {
double first_re_zagreb = 0;
for (Edge e : g.getEdges()) {
int d = g.getDegree(e.source) +
g.getDegree(e.target) - 2;
first_re_zagreb += Math.pow(d, alpha + 1);
}
return first_re_zagreb;
}
public double getFirstReZagrebCoindex(double alpha) {
double ret = 0;
if(g.getEdgesCount()==1) return ret;
GraphModel lg = Utils.createLineGraph(g);
GraphModel clg = (GraphModel) LibraryUtils.complement(lg);
for (Edge e : clg.getEdges()) {
int v1 = lg.getDegree(lg.getVertex(e.source.getId()));
int v2 = lg.getDegree(lg.getVertex(e.target.getId()));
ret += Math.pow(v1, alpha) + Math.pow(v2, alpha);
}
return ret;
}
public double getSecondReZagrebCoindex(double alpha) {
double ret = 0;
if(g.getEdgesCount()==1) return ret;
GraphModel lg = Utils.createLineGraph(g);
GraphModel clg = (GraphModel) LibraryUtils.complement(lg);
for (Edge e : clg.getEdges()) {
int v1 = lg.getDegree(lg.getVertex(e.source.getId()));
int v2 = lg.getDegree(lg.getVertex(e.target.getId()));
ret += Math.pow(v1*v2, alpha);
}
return ret;
}
double getSecondReZagreb(double alpha) {
double second_re_zagreb = 0;
ArrayList<Edge> eds = new ArrayList<>();
for (Edge ee : g.getEdges()) {
eds.add(ee);
}
for (Edge e1 : eds) {
for (Edge e2 : eds) {
if (edge_adj(e1, e2)) {
int d1 = g.getDegree(e1.source) +
g.getDegree(e1.target) - 2;
int d2 = g.getDegree(e2.source) +
g.getDegree(e2.target) - 2;
second_re_zagreb += Math.pow(d1 * d2, alpha);
}
}
}
second_re_zagreb /= 2;
return second_re_zagreb;
}
double getFirstZagrebCoindex(double alpha) {
double first_zagreb = 0;
GraphModel g2 = (GraphModel) LibraryUtils.complement(g);
for (Edge e : g2.getEdges()) {
int v1 = g.getDegree(g.getVertex(e.source.getId()));
int v2 = g.getDegree(g.getVertex(e.target.getId()));
first_zagreb += Math.pow(v1, alpha) + Math.pow(v2, alpha);
}
return first_zagreb;
}
double getSecondZagrebCoindex(double alpha) {
double second_zagreb = 0;
GraphModel g2 = (GraphModel) LibraryUtils.complement(g);
for (Edge e : g2.getEdges()) {
int v1 = g.getDegree(g.getVertex(e.source.getId()));
int v2 = g.getDegree(g.getVertex(e.target.getId()));
second_zagreb += Math.pow(v1*v2, alpha);
}
return second_zagreb;
}
public double getFirstZagrebSelectedEdges(double alpha) {
double first_zagreb = 0;
for (Vertex v : g.vertices()) {
for (Vertex nv : g.getNeighbors(v))
if (g.getEdge(v, nv).isSelected()) {
first_zagreb += Math.pow(g.getDegree(v), alpha + 1);
break;
}
}
return first_zagreb;
}
public double getSecondZagrebSelectedEdges(double alpha) {
double second_zagreb = 0;
for (Edge e : g.getEdges()) {
if (e.isSelected()) {
second_zagreb +=
Math.pow(
g.getDegree(e.source) *
g.getDegree(e.target), alpha);
}
}
return second_zagreb;
}
public double getFirstReZagrebSelectedEdges(double alpha) {
double first_re_zagreb = 0;
for (Edge e : g.getEdges()) {
if (e.isSelected()) {
int d = g.getDegree(e.source) +
g.getDegree(e.target) - 2;
first_re_zagreb += Math.pow(d, alpha + 1);
}
}
return first_re_zagreb;
}
double getSecondReZagrebSelectedEdges(double alpha) {
double second_re_zagreb = 0;
ArrayList<Edge> eds = new ArrayList<>();
for (Edge ee : g.getEdges()) {
eds.add(ee);
}
for (Edge e1 : eds) {
for (Edge e2 : eds) {
if (e1.isSelected() && e2.isSelected()) {
if (edge_adj(e1, e2)) {
int d1 = g.getDegree(e1.source) +
g.getDegree(e1.target) - 2;
int d2 = g.getDegree(e2.source) +
g.getDegree(e2.target) - 2;
second_re_zagreb += Math.pow(d1 * d2, alpha);
}
}
}
}
second_re_zagreb /= 2;
return second_re_zagreb;
}
double getFirstZagrebCoindexSelectedEdges(double alpha) {
double first_zagreb = 0;
boolean cond1 = false, cond2=false;
for (Vertex v1 : g.getVertexArray()) {
for (Vertex v2 : g.getVertexArray()) {
for(Vertex nv1 : g.getNeighbors(v1)) {
if(g.getEdge(v1,nv1).isSelected()) {
cond1 = true;
break;
}
}
for(Vertex nv2 : g.getNeighbors(v2)) {
if(g.getEdge(v2,nv2).isSelected()) {
cond2 = true;
break;
}
}
if(cond1 && cond2) {
if (v1.getId() != v2.getId()) {
if (!g.isEdge(v1, v2)) {
first_zagreb += Math.pow(g.getDegree(v1), alpha) +
Math.pow(g.getDegree(v2), alpha);
}
}
}
}
}
first_zagreb /= 2;
return first_zagreb;
}
double getSecondZagrebCoindexSelectedEdges(double alpha) {
double second_zagreb = 0;
boolean cond1 = false, cond2 = false;
for (Vertex v1 : g.getVertexArray()) {
for (Vertex v2 : g.getVertexArray()) {
for (Vertex nv1 : g.getNeighbors(v1)) {
if (g.getEdge(v1, nv1).isSelected()) {
cond1 = true;
break;
}
}
for (Vertex nv2 : g.getNeighbors(v2)) {
if (g.getEdge(v2, nv2).isSelected()) {
cond2 = true;
break;
}
}
if (cond1 && cond2) {
if (v1.getId() != v2.getId()) {
if (!g.isEdge(v1, v2)) {
second_zagreb += Math.pow(g.getDegree(v1) *
g.getDegree(v2), alpha);
}
}
}
}
}
second_zagreb /= 2;
return second_zagreb;
}
public double getFirstVariableZagrebIndex(double alpha) {
double ret = 0;
for(Vertex v : g) {
ret += Math.pow(g.getDegree(v),
2*alpha);
}
return ret;
}
public double getSecondVariableZagrebIndex(double alpha) {
double ret = 0;
for(Edge e : g.getEdges()) {
double degs = g.getDegree(e.source);
double degt = g.getDegree(e.target);
ret+= Math.pow(degs*degt,alpha);
}
return ret;
}
public double getSecondMixZagrebIndex(double alpha, double beta) {
double ret=0;
for(Edge e : g.getEdges()) {
ret+=Math.pow(g.getDegree(e.source),alpha)*Math.pow(g.getDegree(e.target),beta) +
Math.pow(g.getDegree(e.source),beta)*Math.pow(g.getDegree(e.target),alpha);
}
return ret;
}
public double getGeneralSumConnectivityIndex(double alpha) {
double ret = 0;
for (Edge e : g.getEdges()) {
ret+=Math.pow(g.getDegree(e.source)+g.getDegree(e.target),alpha);
}
return ret;
}
public double getHarmonicIndex() {
double ret = 0;
for (Edge e : g.getEdges()) {
ret+=2./(g.getDegree(e.source)+g.getDegree(e.target));
}
return ret;
}
public double getFirstPathZagrebIndex(double alpha) {
double ret = 0;
GraphModel g2 = Utils.createLineGraph(g);
for(Edge e : g2.getEdges()) {
Vertex src = e.source;
Vertex tgt = e.target;
Edge e1= (Edge) src.getProp().obj;
Edge e2= (Edge) tgt.getProp().obj;
if(e1.source.getId()==e2.source.getId()) {
ret+=Math.pow(g.getDegree(e1.target),alpha-1);
ret+=Math.pow(g.getDegree(e2.target),alpha-1);
}
if(e1.target.getId()==e2.source.getId()) {
ret += Math.pow(g.getDegree(e1.source), alpha - 1);
ret += Math.pow(g.getDegree(e2.target), alpha - 1);
}
if(e1.source.getId()==e2.target.getId()) {
ret+=Math.pow(g.getDegree(e1.target),alpha-1);
ret+=Math.pow(g.getDegree(e2.source),alpha-1);
}
if(e1.target.getId()==e2.target.getId()) {
ret+=Math.pow(g.getDegree(e1.source),alpha-1);
ret+=Math.pow(g.getDegree(e2.source),alpha-1);
}
}
return ret;
}
public double getSecondPathZagrebIndex(double alpha) {
double ret = 0;
GraphModel g2 = Utils.createLineGraph(g);
for(Edge e : g2.getEdges()) {
Vertex src = e.source;
Vertex tgt = e.target;
Edge e1= (Edge) src.getProp().obj;
Edge e2= (Edge) tgt.getProp().obj;
if(e1.source.getId()==e2.source.getId()) {
ret+=Math.pow(g.getDegree(e1.target)*g.getDegree(e2.target),alpha);
}
if(e1.target.getId()==e2.source.getId()) {
ret += Math.pow(g.getDegree(e1.source)*g.getDegree(e2.target),alpha);
}
if(e1.source.getId()==e2.target.getId()) {
ret+=Math.pow(g.getDegree(e1.target)*g.getDegree(e2.source),alpha);
}
if(e1.target.getId()==e2.target.getId()) {
ret+=Math.pow(g.getDegree(e1.source)*g.getDegree(e2.source),alpha);
}
}
return ret;
}
private boolean edge_adj(Edge e1,Edge e2) {
if(e1.source.getId()==e2.source.getId() &&
e1.target.getId()==e2.target.getId()) return false;
else if(e1.target.getId()==e2.source.getId() &&
e1.source.getId()==e2.target.getId()) return false;
else if(e1.source.getId() == e2.source.getId()) return true;
else if(e1.source.getId() == e2.target.getId()) return true;
else if(e1.target.getId() == e2.source.getId()) return true;
else if(e1.target.getId() == e2.target.getId()) return true;
return false;
}
}