// 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.basicreports;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.RenderTable;
import graphtea.graph.graph.Vertex;
import graphtea.platform.lang.CommandAttitude;
import graphtea.plugins.reports.extension.GraphReportExtension;
import java.util.Vector;
import static graphtea.extensions.Utils.choose;
/**
* @author Mohammad Ali Rostami
*/
@CommandAttitude(name = "num_of_stars", abbreviation = "_noss")
public class SubTreeCounting implements GraphReportExtension {
public Object calculate(GraphModel g) {
RenderTable ret = new RenderTable(2);
Vector<String> titles = new Vector<>();
Vector<Object> elem = new Vector<>();
double maxDeg = 0;
for(Vertex v : g) {
if(g.getDegree(v) > maxDeg)
maxDeg = g.getDegree(v);
}
titles.add("D(i,j)");
ret.setTitles(titles);
for(int i=1;i<=maxDeg;i++) {
titles.add("" + i);
}
ret.setTitles(titles);
for(int i=1;i<=maxDeg;i++) {
Vector<Object> tmp = new Vector<>();
tmp.add(i+"");
for(int j=1;j<=maxDeg;j++) {
int sum = countSubtrees(g, i, j);
tmp.add(sum);
}
ret.add(tmp);
}
return ret;
}
private static int countSubtrees(GraphModel g, int i, int j) {
int sum = 0;
for(Edge e : g.getEdges()) {
if (i == j) {
sum += choose(g.getDegree(e.source)-1,i).intValue()*
choose(g.getDegree(e.target)-1,j).intValue();
} else {
sum += choose(g.getDegree(e.source)-1,i).intValue()*
choose(g.getDegree(e.target)-1,j).intValue();
sum += choose(g.getDegree(e.source)-1,j).intValue()*
choose(g.getDegree(e.target)-1,i).intValue();
}
}
return sum;
}
public String getName() {
return "Number of Subtrees";
}
public String getDescription() {
return "Number of Subtrees";
}
@Override
public String getCategory() {
return "Subtree Counting ";
}
}