Search in sources :

Example 66 with Edge

use of org.gephi.graph.api.Edge in project gephi-plugins-bootcamp by gephi.

the class RemoveCrossingEdgesFilter method filter.

@Override
public Graph filter(Graph graph) {
    Edge[] edges = graph.getEdges().toArray();
    for (Edge e : edges) {
        for (Edge f : edges) {
            if (e != f && graph.contains(e) && graph.contains(f) && !e.isSelfLoop() && !f.isSelfLoop()) {
                Node s1 = e.getSource();
                Node t1 = e.getTarget();
                Node s2 = f.getSource();
                Node t2 = f.getTarget();
                double s1x = s1.x();
                double s1y = s1.y();
                double t1x = t1.x();
                double t1y = t1.y();
                double s2x = s2.x();
                double s2y = s2.y();
                double t2x = t2.x();
                double t2y = t2.y();
                double i1x = t1x - s1x;
                double i2x = t2x - s2x;
                double i1y = t1y - s1y;
                double i2y = t2y - s2y;
                double a = (-i1y * (s1x - s2x) + i1x * (s1y - s2y)) / (-i2x * i1y + i1x * i2y);
                double b = (i2x * (s1y - s2y) - i2y * (s1x - s2x)) / (-i2x * i1y + i1x * i2y);
                // Collision
                if (a > 0 && a < 1 && b > 0 && b < 1) {
                    // Randomly remove an edge
                    double random = Math.random();
                    if (random > 0.5) {
                        graph.removeEdge(e);
                    } else {
                        graph.removeEdge(f);
                    }
                }
            }
        }
    }
    return graph;
}
Also used : Node(org.gephi.graph.api.Node) Edge(org.gephi.graph.api.Edge)

Example 67 with Edge

use of org.gephi.graph.api.Edge in project gephi-plugins-bootcamp by gephi.

the class InvertRowSelection method execute.

@Override
public void execute() {
    // Note that a function to inverse selection directly in the table with DataTablesController
    // would be more efficient than calculating it here, but this example demonstrates some table selection features.
    DataTablesController dtc = Lookup.getDefault().lookup(DataTablesController.class);
    Graph graph = Lookup.getDefault().lookup(GraphController.class).getGraphModel().getGraph();
    if (dtc.isNodeTableMode()) {
        // Get currently selected nodes and calculate inverse set.
        Node[] selected = dtc.getNodeTableSelection();
        ArrayList<Node> nodes = new ArrayList<Node>();
        nodes.addAll(Arrays.asList(graph.getNodes().toArray()));
        for (Node node : selected) {
            nodes.remove(node);
        }
        dtc.setNodeTableSelection(nodes.toArray(new Node[0]));
    } else if (dtc.isEdgeTableMode()) {
        // Get currently selected edges and calculate inverse set.
        Edge[] selected = dtc.getEdgeTableSelection();
        ArrayList<Edge> edges = new ArrayList<Edge>();
        edges.addAll(Arrays.asList(graph.getEdges().toArray()));
        for (Edge edge : selected) {
            edges.remove(edge);
        }
        dtc.setEdgeTableSelection(edges.toArray(new Edge[0]));
    }
}
Also used : Graph(org.gephi.graph.api.Graph) Node(org.gephi.graph.api.Node) ArrayList(java.util.ArrayList) Edge(org.gephi.graph.api.Edge) DataTablesController(org.gephi.datalab.api.datatables.DataTablesController)

Example 68 with Edge

use of org.gephi.graph.api.Edge in project gephi by gephi.

the class AttributeColumnsControllerImpl method importCSVToEdgesTable.

@Override
public void importCSVToEdgesTable(Graph graph, File file, Character separator, Charset charset, String[] columnNames, Class[] columnTypes, boolean createNewNodes) {
    if (columnNames == null || columnNames.length == 0) {
        return;
    }
    if (columnTypes == null || columnNames.length != columnTypes.length) {
        throw new IllegalArgumentException("Column names length must be the same as column types length");
    }
    CsvReader reader = null;
    graph.writeLock();
    try {
        //Prepare attribute columns for the column names, creating the not already existing columns:
        Table edgesTable = graph.getModel().getEdgeTable();
        Column weightColumn = edgesTable.getColumn("Weight");
        boolean isDynamicWeight = weightColumn.isDynamic();
        String idColumnHeader = null;
        String sourceColumnHeader = null;
        String targetColumnHeader = null;
        String typeColumnHeader = null;
        String weightColumnHeader = null;
        //Necessary because of column name case insensitivity, to map columns to its corresponding csv header.
        HashMap<Column, String> columnHeaders = new HashMap<>();
        for (int i = 0; i < columnNames.length; i++) {
            //Separate first id column found from the list to use as id. If more are found later, the will not be in the list and be ignored.
            if (columnNames[i].equalsIgnoreCase("id")) {
                if (idColumnHeader == null) {
                    idColumnHeader = columnNames[i];
                }
            } else if (columnNames[i].equalsIgnoreCase("source") && sourceColumnHeader == null) {
                //Separate first source column found from the list to use as source node id
                sourceColumnHeader = columnNames[i];
            } else if (columnNames[i].equalsIgnoreCase("target") && targetColumnHeader == null) {
                //Separate first target column found from the list to use as target node id
                targetColumnHeader = columnNames[i];
            } else if (columnNames[i].equalsIgnoreCase("type") && typeColumnHeader == null) {
                //Separate first type column found from the list to use as edge type (directed/undirected)
                typeColumnHeader = columnNames[i];
            } else if (edgesTable.hasColumn(columnNames[i])) {
                //Any other existing column:
                Column column = edgesTable.getColumn(columnNames[i]);
                columnHeaders.put(column, columnNames[i]);
                if (column.equals(weightColumn)) {
                    weightColumnHeader = columnNames[i];
                }
            } else {
                //New column:
                Column column = addAttributeColumn(edgesTable, columnNames[i], columnTypes[i]);
                if (column != null) {
                    columnHeaders.put(column, columnNames[i]);
                }
            }
        }
        Set<Column> columnList = columnHeaders.keySet();
        //Create edges:
        GraphElementsController gec = Lookup.getDefault().lookup(GraphElementsController.class);
        reader = new CsvReader(new FileInputStream(file), separator, charset);
        reader.setTrimWhitespace(false);
        reader.readHeaders();
        int recordNumber = 0;
        while (reader.readRecord()) {
            String id = null;
            Edge edge = null;
            String sourceId, targetId;
            Node source, target;
            String type;
            boolean directed;
            recordNumber++;
            sourceId = reader.get(sourceColumnHeader);
            targetId = reader.get(targetColumnHeader);
            if (sourceId == null || sourceId.trim().isEmpty() || targetId == null || targetId.trim().isEmpty()) {
                Logger.getLogger("").log(Level.WARNING, "Ignoring record number {0} due to empty source and/or target node ids", recordNumber);
                //No correct source and target ids were provided, ignore row
                continue;
            }
            source = graph.getNode(sourceId);
            if (source == null) {
                if (createNewNodes) {
                    //Create new nodes when they don't exist already and option is enabled
                    if (source == null) {
                        source = gec.createNode(null, sourceId, graph);
                    }
                } else {
                    //Ignore this edge row, since no new nodes should be created.
                    continue;
                }
            }
            target = graph.getNode(targetId);
            if (target == null) {
                if (createNewNodes) {
                    //Create new nodes when they don't exist already and option is enabled
                    if (target == null) {
                        target = gec.createNode(null, targetId, graph);
                    }
                } else {
                    //Ignore this edge row, since no new nodes should be created.
                    continue;
                }
            }
            if (typeColumnHeader != null) {
                type = reader.get(typeColumnHeader);
                //Undirected if indicated correctly, otherwise always directed:
                if (type != null) {
                    directed = !type.equalsIgnoreCase("undirected");
                } else {
                    directed = true;
                }
            } else {
                //Directed by default when not indicated
                directed = true;
            }
            //Prepare the correct edge to assign the attributes:
            if (idColumnHeader != null) {
                id = reader.get(idColumnHeader);
                if (id == null || id.trim().isEmpty()) {
                    //id null or empty, assign one
                    edge = gec.createEdge(source, target, directed);
                } else {
                    Edge edgeById = graph.getEdge(id);
                    if (edgeById == null) {
                        //Create edge because no edge with that id exists
                        edge = gec.createEdge(id, source, target, directed);
                    }
                }
            } else {
                if (findEdge(graph, null, source, target, directed) == null) {
                    //Only create if it does not exist
                    edge = gec.createEdge(source, target, directed);
                }
            }
            if (edge != null) {
                //Assign all attributes to the new edge:
                for (Column column : columnList) {
                    setAttributeValue(reader.get(columnHeaders.get(column)), edge, column);
                }
            } else {
                edge = findEdge(graph, id, source, target, directed);
                if (edge != null) {
                    //Increase non dynamic edge weight with specified weight (if specified), else increase by 1:
                    if (!isDynamicWeight) {
                        if (weightColumnHeader != null) {
                            String weight = reader.get(weightColumnHeader);
                            try {
                                Float weightFloat = Float.parseFloat(weight);
                                edge.setWeight(edge.getWeight() + weightFloat);
                            } catch (NumberFormatException numberFormatException) {
                                //Not valid weight, add 1
                                edge.setWeight(edge.getWeight() + 1);
                                Logger.getLogger("").log(Level.WARNING, "Could not parse weight {0}, adding 1", weight);
                            }
                        } else {
                            //Add 1 (weight not specified)
                            edge.setWeight(edge.getWeight() + 1);
                        }
                    }
                } else {
                    Logger.getLogger("").log(Level.WARNING, "Could not add edge [id = {0}, source = {1}, target = {2}, directed = {3}] to the graph and could not find the existing edge to add its weight. Skipping edge", new Object[] { id, source.getId(), target.getId(), directed });
                }
            }
        }
    } catch (FileNotFoundException ex) {
        Logger.getLogger("").log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger("").log(Level.SEVERE, null, ex);
    } finally {
        graph.readUnlockAll();
        graph.writeUnlock();
        if (reader != null) {
            reader.close();
        }
    }
}
Also used : Table(org.gephi.graph.api.Table) HashMap(java.util.HashMap) Node(org.gephi.graph.api.Node) FileNotFoundException(java.io.FileNotFoundException) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) CsvReader(com.csvreader.CsvReader) Column(org.gephi.graph.api.Column) GraphElementsController(org.gephi.datalab.api.GraphElementsController) Edge(org.gephi.graph.api.Edge)

Example 69 with Edge

use of org.gephi.graph.api.Edge in project gephi by gephi.

the class ExporterGML method exportData.

private void exportData(Graph graph) throws IOException {
    printOpen("graph");
    printTag("Creator \"Gephi\"");
    if (graph.isDirected() || graph.isMixed()) {
        printTag("directed 1");
    } else if (graph.isUndirected()) {
        printTag("directed 0");
    }
    NodeIterable nodeIterable = graph.getNodes();
    for (Node node : nodeIterable) {
        if (cancel) {
            nodeIterable.doBreak();
            return;
        }
        printNode(node, graph);
    }
    EdgeIterable edgeIterable = graph.getEdges();
    for (Edge edge : edgeIterable) {
        if (cancel) {
            edgeIterable.doBreak();
            return;
        }
        printEdge(edge, graph);
    }
    printClose();
}
Also used : NodeIterable(org.gephi.graph.api.NodeIterable) EdgeIterable(org.gephi.graph.api.EdgeIterable) Node(org.gephi.graph.api.Node) Edge(org.gephi.graph.api.Edge)

Example 70 with Edge

use of org.gephi.graph.api.Edge in project gephi by gephi.

the class LegacyDataPersistenceProvider method readData.

public void readData(XMLStreamReader reader, GraphModel graphModel, LegacyMapHelper helper) throws XMLStreamException {
    Graph graph = graphModel.getGraph();
    boolean end = false;
    while (reader.hasNext() && !end) {
        Integer eventType = reader.next();
        if (eventType.equals(XMLEvent.START_ELEMENT)) {
            String name = reader.getLocalName();
            if (ELEMENT_NODEDATA.equalsIgnoreCase(name)) {
                Node node = graph.getNode(helper.preToIdMap.get(reader.getAttributeValue(null, "nodepre")));
                readNodeData(reader, node);
            } else if (ELEMENT_EDGEDATA.equalsIgnoreCase(name)) {
                Node source = graph.getNode(helper.preToIdMap.get(reader.getAttributeValue(null, "sourcepre")));
                Node target = graph.getNode(helper.preToIdMap.get(reader.getAttributeValue(null, "targetpre")));
                Edge edge = graph.getEdge(source, target, 0);
                readEdgeData(reader, edge);
            }
        } else if (eventType.equals(XMLStreamReader.END_ELEMENT)) {
            if (ELEMENT_DATA.equalsIgnoreCase(reader.getLocalName())) {
                end = true;
            }
        }
    }
}
Also used : Graph(org.gephi.graph.api.Graph) Node(org.gephi.graph.api.Node) Edge(org.gephi.graph.api.Edge)

Aggregations

Edge (org.gephi.graph.api.Edge)151 Node (org.gephi.graph.api.Node)122 GraphModel (org.gephi.graph.api.GraphModel)84 GraphController (org.gephi.graph.api.GraphController)79 Test (org.testng.annotations.Test)67 UndirectedGraph (org.gephi.graph.api.UndirectedGraph)46 DirectedGraph (org.gephi.graph.api.DirectedGraph)44 Graph (org.gephi.graph.api.Graph)31 HashMap (java.util.HashMap)26 EdgeIterable (org.gephi.graph.api.EdgeIterable)18 LinkedList (java.util.LinkedList)13 Column (org.gephi.graph.api.Column)11 NodeIterable (org.gephi.graph.api.NodeIterable)9 ArrayList (java.util.ArrayList)8 Table (org.gephi.graph.api.Table)6 GraphView (org.gephi.graph.api.GraphView)5 HashSet (java.util.HashSet)4 Interval (org.gephi.graph.api.Interval)4 TimeFormat (org.gephi.graph.api.TimeFormat)4 DateTimeZone (org.joda.time.DateTimeZone)4