// 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.plugins.commandline.commands; import Jama.Matrix; import graphtea.graph.graph.Edge; import graphtea.graph.graph.GPoint; import graphtea.graph.graph.GraphModel; import graphtea.graph.graph.Vertex; import graphtea.graph.ui.GTabbedGraphPane; import graphtea.library.algorithms.goperators.EdgeInduced; import graphtea.library.algorithms.goperators.GraphUnion; import graphtea.library.algorithms.goperators.VertexCorona; import graphtea.library.algorithms.goperators.VertexInduced; import graphtea.library.algorithms.goperators.product.*; import graphtea.library.util.Pair; import graphtea.platform.core.BlackBoard; import graphtea.platform.lang.CommandAttitude; import graphtea.platform.parameter.Parameter; import graphtea.plugins.graphgenerator.core.PositionGenerators; import graphtea.plugins.main.GraphData; import java.awt.*; import java.util.HashSet; /** * @author Mohammad Ali Rostami * @email rostamiev@gmail.com */ public class GraphCommands { BlackBoard bb; public GraphCommands(BlackBoard bb) { this.bb = bb; datas = new GraphData(bb); } GraphData datas; @CommandAttitude(name = "current_graph", abbreviation = "_cg" , description = "the matrix related to the graph") public GraphModel getCurrentGraph() { return datas.getGraph(); } @CommandAttitude(name = "matrix", abbreviation = "_mat" , description = "the matrix related to the graph") public Matrix graph2Matrix() { return datas.getGraph().getAdjacencyMatrix(); } @CommandAttitude(name = "weighted_matrix", abbreviation = "_wmat" , description = "the weighted matrix related to the graph (with MatLab matrix format)") public String weightMatrix() { GraphModel g = datas.getGraph(); String ret = ""; for (Vertex v : g) { for (Vertex w : g) { Edge e = g.getEdge(v, w); ret += " " + (e == null ? "0" : e.getWeight()) + " ,"; } ret = ret.substring(0, ret.length() - 1); ret += ";"; } if (g.getVerticesCount() > 0) ret = ret.substring(0, ret.length() - 1); return "[" + ret + "]"; } @CommandAttitude(name = "matlab_matrix", abbreviation = "_mt" , description = "the weighted matrix related to the graph (with MatLab matrix format)") public String matlabMatrix() { GraphModel g = datas.getGraph(); String ret = ""; for (Vertex v : g) { for (Vertex w : g) { Edge e = g.getEdge(v, w); ret += " " + (e == null ? "0" : "1") + " ,"; } ret = ret.substring(0, ret.length() - 1); ret += ";"; } if (g.getVerticesCount() > 0) ret = ret.substring(0, ret.length() - 1); return "[" + ret + "]"; } @CommandAttitude(name = "add_tab", abbreviation = "_at" , description = "Adds a new Tab to GUI") public void addTab() { datas.core.addTab(); } @CommandAttitude(name = "show_graph", abbreviation = "_sg" , description = "Shows the given graph in a new TAB") public void showGraph(@Parameter(name = "graph")GraphModel g) { datas.core.addTabNoGUI(g.isDirected(), bb); datas.getGraph().addSubGraph(g, new Rectangle (100,100, 500,500)); } @CommandAttitude(name = "clear_graph", abbreviation = "_cg" , description = "Clears the graph") public void clearGraph() { datas.core.clearGraph(); } @CommandAttitude(name = "close_tab", abbreviation = "_ct" , description = "closes the selected tab from GUI") public void closeTab() { datas.core.closeTab(); } @CommandAttitude(name = "cut", abbreviation = "_c" , description = "Cuts the selected data to clipboard") public void cutToClipboard() throws ShellCommandException { if (!(datas.select.isSelectionEmpty())) { datas.core.cutToClipboard(datas.select.getSelected()); } else { throw new ShellCommandException("Nothing has been selected."); } } @CommandAttitude(name = "paste", abbreviation = "_p" , description = "Pastes from the clipboard") public void pasteFromClipboard() { datas.core.pasteFromClipboard(); } @CommandAttitude(name = "reset_graph", abbreviation = "_rg" , description = "Resets the Graph") public void resetGraph() { datas.core.resetGraph(); } // @CommandAttitude(name = "matlab" , abbreviation = "_ml" // , description = "") // public String matlab(@Parameter(name = "matlab_command") String matlab_command) { // return // } // @CommandAttitude(name = "zoom_in", abbreviation = "_zi" // , description = "zooms the board in") // public void zoomIn() { // datas.core.zoomIn(); // } \ // // @CommandAttitude(name = "zoom_out", abbreviation = "_zo" // , description = "zooms the board out") // public void zoomOut() { // datas.core.zoomOut(); // } @CommandAttitude(name = "copy_selected", abbreviation = "_c" , description = "Copies the selected data to clipboard") public void copyToClipboard() throws ShellCommandException { if (!(datas.select.isSelectionEmpty())) { datas.core.copyToClipboard(datas.select.getSelected()); } else { throw new ShellCommandException("Nothing has been selected."); } } @CommandAttitude(name = "induced", abbreviation = "_induce", description = "Vertex Induced subgraph of given vertices") public GraphModel induced(@Parameter(name = "graph")GraphModel g , @Parameter(name = "vertices")Object[] c) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); resetGraph(); HashSet hs = new HashSet(); for (Object vm : c) { hs.add(getVertexById((Integer) vm, g)); } GraphModel gm = (GraphModel) VertexInduced.induced(g, hs); gm.setDirected(g.isDirected()); gtp.addGraph(gm); return gm; } public Vertex getVertexById(int id, GraphModel g) { for (Vertex v : g) if (v.getId() == id) return v; return null; } @CommandAttitude(name = "edge_induced", abbreviation = "_e_induce", description = "Edge Induced subgraph of selected edges") public GraphModel edge_induced(@Parameter(name = "graph")GraphModel g) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); HashSet hs = datas.select.getSelectedEdges(); resetGraph(); GraphModel gm = (GraphModel) EdgeInduced.edgeInduced(g, hs); gm.setDirected(g.isDirected()); gtp.addGraph(gm); return gm; } @CommandAttitude(name = "gunion", abbreviation = "_un", description = "Creates the union of two given graphs") public GraphModel gunion(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GraphModel graphModel = (GraphModel) GraphUnion.union(g1, g2); setUnionLabel(g1, g2, graphModel); graphModel.setDirected(g1.isDirected()); gtp.addGraph(graphModel); return graphModel; } public void setUnionLabel(GraphModel g1, GraphModel g2, GraphModel graphModel) { for(Vertex v : graphModel) { // v.getSize().multiply(1.5); } for(int i=0;i < g1.getVerticesCount();i++) { Vertex v = graphModel.getVertex(i); String gname = g1.getLabel(); graphModel.getVertex(i).setLabel(gname.substring(1) + "_" + v.getLabel()); } for(int i=0;i < g2.getVerticesCount();i++) { int ind = i + g1.getVerticesCount(); Vertex v = graphModel.getVertex(ind); String gname = g2.getLabel(); graphModel.getVertex(ind).setLabel(gname.substring(1) + "_" + v.getLabel()); } } @CommandAttitude(name = "gcorona", abbreviation = "_gcorona", description = "Creates the union of two given graphs") public GraphModel gcorona(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GraphModel graphModel = (GraphModel) VertexCorona.corona(g1, g2); for(Vertex v : graphModel) { //v.getSize().multiply(1.5); } Vertex[] varr=graphModel.getVertexArray(); int k =0; for(int i=g1.getVerticesCount();i< graphModel.getVerticesCount(); i=i+g2.getVerticesCount(),k++) { varr[k].setLabel(g1.getLabel().substring(1)+ "_"+varr[k].getLabel()); for(int j=0;j<g2.getVerticesCount();j++) { int index=g1.getVerticesCount()+g2.getVerticesCount()*k + j; varr[index].setLabel(g2.getLabel().substring(1)+"_"+varr[index].getLabel()+"_"+k); GPoint gp1 = varr[index].getLocation(); GPoint gp2 = varr[k].getLocation(); GPoint gp3 = GPoint.sub(gp2,gp1); gp3= GPoint.div(gp3,2); gp3.add(gp1); graphModel.getVertex(varr[index].getId()).setLocation(gp3); } } graphModel.setDirected(g1.isDirected()); gtp.addGraph(graphModel); return graphModel; } @CommandAttitude(name = "gsum", abbreviation = "_gsum", description = "Creates the sum of two given graphs") public GraphModel gsum(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GraphModel graphModel = (GraphModel) GraphUnion.union(g1,g2); setUnionLabel(g1,g2,graphModel); Vertex[] varr = graphModel.getVertexArray(); for(int i=0; i < g1.getVerticesCount();i++) { for(int j=0;j<g2.getVerticesCount();j++) { graphModel.addEdge(new Edge( varr[i],varr[g1.getVerticesCount()+j] )); } } graphModel.setDirected(g1.isDirected()); gtp.addGraph(graphModel); return graphModel; } @CommandAttitude(name = "cartesian_product", abbreviation = "_cproduct", description = "Computes and shows the cartesian product of given graphs") public void cartesian_product(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GCartesianProduct p = new GCartesianProduct(); GraphModel graphModel = (GraphModel) p.multiply(g1, g2); setProductLabel(graphModel); graphModel.setDirected(g1.isDirected()); int n = graphModel.getVerticesCount(); Point ps[] = PositionGenerators.circle(250, 300, 300, n); int count = 0; for (Vertex v : graphModel) { v.setLocation(new GPoint(ps[count].x, ps[count].y)); count++; } gtp.addGraph(graphModel); } public void setProductLabel(GraphModel graphModel) { //for(Vertex v:graphModel) v.getSize().multiply(1.5); for(Vertex v:graphModel) { Pair<Vertex,Vertex> pp = (Pair<Vertex, Vertex>) v.getProp().obj; v.setLabel(pp.first.getLabel()+ "_"+pp.second.getLabel()); } } @CommandAttitude(name = "tensor_product", abbreviation = "_tproduct", description = "Computes and shows the cartesian product of given graphs") public void tensor_product(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GTensorProduct p = new GTensorProduct(); GraphModel graphModel = (GraphModel) p.multiply(g1, g2); setProductLabel(graphModel); graphModel.setDirected(g1.isDirected()); int n = graphModel.getVerticesCount(); Point ps[] = PositionGenerators.circle(250, 300, 300, n); int count = 0; for (Vertex v : graphModel) { v.setLocation(new GPoint(ps[count].x, ps[count].y)); count++; } gtp.addGraph(graphModel); } @CommandAttitude(name = "gdisjunction", abbreviation = "_disj", description = "Computes the disjunction of graphs") public void disjunction(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GDisjunction p = new GDisjunction(); GraphModel graphModel = (GraphModel) p.multiply(g1, g2); graphModel.setDirected(g1.isDirected()); int n = graphModel.getVerticesCount(); Point ps[] = PositionGenerators.circle(200, 300, 300, n); int count = 0; for (Vertex v : graphModel) { v.setLocation(new GPoint(ps[count].x, ps[count].y)); count++; } gtp.addGraph(graphModel); } @CommandAttitude(name = "gsymdiff", abbreviation = "_symdiff", description = "Computes the symmetric difference of graphs") public void symdiff(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GSymDiff p = new GSymDiff(); GraphModel graphModel = (GraphModel) p.multiply(g1, g2); setProductLabel(graphModel); graphModel.setDirected(g1.isDirected()); int n = graphModel.getVerticesCount(); Point ps[] = PositionGenerators.circle(200, 300, 300, n); int count = 0; for (Vertex v : graphModel) { v.setLocation(new GPoint(ps[count].x, ps[count].y)); count++; } gtp.addGraph(graphModel); } @CommandAttitude(name = "gcomposition", abbreviation = "_composition", description = "Computes the composition of graphs") public void composition(@Parameter(name = "first_graph")GraphModel g1 , @Parameter(name = "second_graph")GraphModel g2) { GTabbedGraphPane gtp = bb.getData(GTabbedGraphPane.NAME); GComposition p = new GComposition(); GraphModel graphModel = (GraphModel) p.multiply(g1, g2); setProductLabel(graphModel); graphModel.setDirected(g1.isDirected()); int n = graphModel.getVerticesCount(); Point ps[] = PositionGenerators.circle(200, 300, 300, n); int count = 0; for (Vertex v : graphModel) { v.setLocation(new GPoint(ps[count].x, ps[count].y)); count++; } gtp.addGraph(graphModel); } }