All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.graphstream.graph.Node Maven / Gradle / Ivy

Go to download

The GraphStream library. With GraphStream you deal with graphs. Static and Dynamic. You create them from scratch, from a file or any source. You display and render them. This is the core package that contains the minimal needed to read and write a graph.

There is a newer version: 2.0
Show newest version
/*
 * Copyright 2006 - 2015
 *     Stefan Balev     
 *     Julien Baudry    
 *     Antoine Dutot    
 *     Yoann Pigné      
 *     Guilhelm Savin   
 * 
 * This file is part of GraphStream .
 * 
 * GraphStream is a library whose purpose is to handle static or dynamic
 * graph, create them from scratch, file or any source and display them.
 * 
 * This program is free software distributed under the terms of two licenses, the
 * CeCILL-C license that fits European law, and the GNU Lesser General Public
 * License. You can  use, modify and/ or redistribute the software under the terms
 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following
 * URL  or under the terms of the GNU LGPL as published by
 * the Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 * 
 * The fact that you are presently reading this means that you have had
 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms.
 */
package org.graphstream.graph;

import java.util.Collection;
import java.util.Iterator;

/**
 * An Interface that advises general purpose methods for handling nodes as
 * elements of a graph.
 * 
 * 

Important

*

* Implementing classes should indicate the complexity of their implementation * for each method. *

* * @since July 12 2007 */ public interface Node extends Element, Iterable { /** * Parent graph. Some elements are not able to give their parent graph. * * @return The graph containing this node or null if unknown. */ Graph getGraph(); /** * Total number of relations with other nodes or this node. * * @return The number of edges/relations/links. */ int getDegree(); /** * Number of leaving edges. * * @return the count of edges that only leave this node plus all undirected * edges. */ int getOutDegree(); /** * Number of entering edges. * * @return the count of edges that only enter this node plus all undirected * edges. */ int getInDegree(); /** * True if an edge leaves this node toward node 'id'. * * @param id * Identifier of the target node. * @return True if a directed edge goes from this node to 'id' or if an * undirected edge exists. */ boolean hasEdgeToward(String id); /** * True if an edge enters this node from node 'id'. * * @param id * Identifier of the source node. * @return True if a directed edge goes from this node to 'id' or if an * undirected edge exists. */ boolean hasEdgeFrom(String id); /** * True if an edge exists between this node and node 'id'. * * @param id * Identifier of another node. * @return True if a edge exists between this node and node 'id'. */ boolean hasEdgeBetween(String id); /** * Retrieve an edge that leaves this node toward 'id'. *

* This method selects only edges leaving this node an pointing at node 'id' * (this also selects undirected edges). *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeToward("...");
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param id * Identifier of the target node. * @return Directed edge going from this node to 'id', or undirected edge if * it exists, else null. */ T getEdgeToward(String id); /** * Retrieve an edge that leaves node 'id' toward this node. *

* This method selects only edges leaving node 'id' an pointing at this node * (this also selects undirected edges). *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeFrom("...");
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param id * Identifier of the source node. * @return Directed edge going from node 'id' to this node, or undirected * edge if it exists, else null. */ T getEdgeFrom(String id); /** * Retrieve an edge between this node and the node 'id', if it exits. *

* This method selects directed or undirected edges. If the edge is * directed, its direction is not important and leaving or entering edges * will be selected. *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeBetween("...");
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param id * Identifier of the opposite node. * @return Edge between node 'id' and this node if it exists, else null. */ T getEdgeBetween(String id); /** * Iterator on the set of connected edges. *

* This iterator iterates on all edges leaving and entering (this includes * any non-directed edge present, and a non-directed edge is only iterated * once). *

*

* This method is implicitly generic and return an Iterator over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedEdge> ite = node.getEdgeIterator();
	 * 
* * the method will return an Iterator<ExtendedEdge>. If no left part * exists, method will just return an Iterator<Edge>. *

* * @return The iterator, edges are iterated in arbitrary order. */ Iterator getEdgeIterator(); /** * Iterator only on leaving edges. *

* This iterator iterates only on directed edges going from this node to * others (non-directed edges are included in the iteration). *

*

* This method is implicitly generic and return an Iterator over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedEdge> ite = node.getEnteringEdgeIterator();
	 * 
* * the method will return an Iterator<ExtendedEdge>. If no left part * exists, method will just return an Iterator<Edge>. *

* * @return The iterator, edges are iterated in arbitrary order. */ Iterator getEnteringEdgeIterator(); /** * Iterator only on entering edges. *

* This iterator iterates only on directed edges going from other nodes * toward this node (non-directed edges are included in the iteration). *

*

* This method is implicitly generic and return an Iterator over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedEdge> ite = node.getLeavingEdgeIterator();
	 * 
* * the method will return an Iterator<ExtendedEdge>. If no left part * exists, method will just return an Iterator<Edge>. *

* * @return The iterator, edges are iterated in arbitrary order. */ Iterator getLeavingEdgeIterator(); /** * Iterator on the set of neighbor nodes connected to this node via one or * more edges. This iterator iterates across any leaving, entering and non * directed edges (nodes are neighbors even if they only have a directed * edge from them toward this node). If there are multiple edges connecting * the same node, it might be iterated several times. * * @return The iterator, neighbors are iterated in arbitrary order. */ Iterator getNeighborNodeIterator(); /** * I-th edge. Edges are stored in no given order. *

* However this method allows to iterate very quickly on all edges, or to * choose a given edge with direct access. *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdge(i);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param i * Index of the edge. * @return The i-th edge. * @throws IndexOutOfBoundException * if i is negative or greater than or equal to the * degree */ T getEdge(int i); /** * I-th entering edge. Edges are stored in no given order. *

* However this method allows to iterate very quickly on all entering edges, * or to choose a given entering edge with direct access. *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEnteringEdge(i);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param i * Index of the edge. * @return The i-th entering edge. * @throws IndexOutOfBoundException * if i is negative or greater than or equal to the * in-degree */ T getEnteringEdge(int i); /** * I-th leaving edge. Edges are stored in no given order. *

* However this method allows to iterate very quickly on all leaving edges, * or to choose a given leaving edge with direct access. *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getLeavingEdge(i);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param i * Index of the edge. * @return The i-th leaving edge. * @throws IndexOutOfBoundException * if i is negative or greater than or equal to the * out-degree */ T getLeavingEdge(int i); /** * Iterator for breadth first exploration of the graph, starting at this * node. *

* If the graph is not connected, only a part of it will be explored. By * default, this iterator will respect edge orientation. *

*

* This method is implicitly generic and return an Iterator over something * which extends Node. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedNode> ite = node.getBreadthFirstIterator();
	 * 
* * the method will return an Iterator<ExtendedNode>. If no left part * exists, method will just return an Iterator<Node>. *

* * @return An iterator able to explore the graph in a breadth first way * starting at this node. */ Iterator getBreadthFirstIterator(); /** * Iterator for breadth first exploration of the graph, starting at this * node. *

* If the graph is not connected, only a part of it will be explored. *

*

* This method is implicitly generic and return an Iterator over something * which extends Node. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedNode> ite = node.getBreadthFirstIterator(true);
	 * 
* * the method will return an Iterator<ExtendedNode>. If no left part * exists, method will just return an Iterator<Node>. *

* * @param directed * If false, the iterator will ignore edge orientation (the * default is "True"). * @return An iterator able to explore the graph in a breadth first way * starting at this node. */ Iterator getBreadthFirstIterator(boolean directed); /** * Iterator for depth first exploration of the graph, starting at this node. *

* If the graph is not connected, only a part of it will be explored. By * default, this iterator will respect edge orientation. *

*

* This method is implicitly generic and return an Iterator over something * which extends Node. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedNode> ite = node.getDepthFirstIterator();
	 * 
* * the method will return an Iterator<ExtendedNode>. If no left part * exists, method will just return an Iterator<Node>. *

* * @return An iterator able to explore the graph in a depth first way * starting at this node. * @complexity of the depth first iterator O(n+m) with n the number of nodes * and m the number of edges. */ Iterator getDepthFirstIterator(); /** * Iterator for depth first exploration of the graph, starting at this node. *

* If the graph is not connected, only a part of it will be explored. *

*

* This method is implicitly generic and return an Iterator over something * which extends Node. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterator<ExtendedNode> ite = node.getDepthFirstIterator(true);
	 * 
* * the method will return an Iterator<ExtendedNode>. If no left part * exists, method will just return an Iterator<Node>. *

* * @param directed * If false, the iterator will ignore edge orientation (the * default is "True"). * @return An iterator able to explore the graph in a depth first way * starting at this node. */ Iterator getDepthFirstIterator(boolean directed); /** * Set of all entering and leaving edges. * *

* This method is implicitly generic and return an Iterable over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterable<ExtendedEdge> ite = node.getEdgeSet();
	 * 
* * the method will return an Iterable<ExtendedEdge>. If no left part * exists, method will just return an Iterable<Edge>. *

* * @return A collection containing all directed and undirected edges, * leaving or entering. */ Iterable getEachEdge(); /** * Set of all leaving edges. *

* This method is implicitly generic and return an Iterable over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterable<ExtendedEdge> ite = node.getLeavingEdgeSet();
	 * 
* * the method will return an Iterable<ExtendedEdge>. If no left part * exists, method will just return an Iterable<Edge>. *

* * @return A collection of only edges that leave this node plus all * undirected edges. */ Iterable getEachLeavingEdge(); /** * Set of all entering edges. *

* This method is implicitly generic and return an Iterable over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterable<ExtendedEdge> ite = node.getEnteringEdgeSet();
	 * 
* * the method will return an Iterable<ExtendedEdge>. If no left part * exists, method will just return an Iterable<Edge>. *

* * @return A collection of only edges that enter this node plus all * undirected edges. */ Iterable getEachEnteringEdge(); /** * Set of all entering and leaving edges. * *

* This method is implicitly generic and return an Iterable over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterable<ExtendedEdge> ite = node.getEdgeSet();
	 * 
* * the method will return an Iterable<ExtendedEdge>. If no left part * exists, method will just return an Iterable<Edge>. *

* * @return A collection containing all directed and undirected edges, * leaving or entering. */ Collection getEdgeSet(); /** * Set of all leaving edges. *

* This method is implicitly generic and return an Iterable over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterable<ExtendedEdge> ite = node.getLeavingEdgeSet();
	 * 
* * the method will return an Iterable<ExtendedEdge>. If no left part * exists, method will just return an Iterable<Edge>. *

* * @return A collection of only edges that leave this node plus all * undirected edges. */ Collection getLeavingEdgeSet(); /** * Set of all entering edges. *

* This method is implicitly generic and return an Iterable over something * which extends Edge. The return type is the one of the left part of the * assignment. For example, in the following call : * *

	 * Iterable<ExtendedEdge> ite = node.getEnteringEdgeSet();
	 * 
* * the method will return an Iterable<ExtendedEdge>. If no left part * exists, method will just return an Iterable<Edge>. *

* * @return A collection of only edges that enter this node plus all * undirected edges. */ Collection getEnteringEdgeSet(); /** * Override the Object.toString() method. */ String toString(); // New methods /** * True if an edge leaves this node toward a given node. * * @param node * The target node. * @return True if a directed edge goes from this node to the other node or * if an undirected edge exists. */ boolean hasEdgeToward(Node node); /** * True if an edge leaves this node toward a node with given index. * * @param index * Index of the target node. * @return True if a directed edge goes from this node to the other node or * if an undirected edge exists. * @throws IndexOutOfBoundsException * if the index is negative or greater than {@code * getNodeCount() - 1}. */ boolean hasEdgeToward(int index) throws IndexOutOfBoundsException; /** * True if an edge enters this node from a given node. * * @param node * The source node. * @return True if a directed edge goes from the other node to this node or * if an undirected edge exists. */ boolean hasEdgeFrom(Node node); /** * True if an edge enters this node from a node with given index. * * @param index * Index of the source node. * @return True if a directed edge goes from the other node to this node or * if an undirected edge exists. * @throws IndexOutOfBoundsException * if the index is negative or greater than {@code * getNodeCount() - 1}. */ boolean hasEdgeFrom(int index) throws IndexOutOfBoundsException; /** * True if an edge exists between this node and another node. * * @param node * Another node. * @return True if an edge exists between this node and the other node. */ boolean hasEdgeBetween(Node node); /** * True if an edge exists between this node and a node with given index. * * @param index * Index of another node. * @return True if an edge exists between this node and the other node. * @throws IndexOutOfBoundsException * if the index is negative or greater than {@code * getNodeCount() - 1}. */ boolean hasEdgeBetween(int index) throws IndexOutOfBoundsException; /** * Retrieves an edge that leaves this node toward another node. *

* This method selects only edges leaving this node an pointing at the * parameter node (this also selects undirected edges). *

*

* This method is implicitly generic and returns something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeToward(...);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param node * The target node. * @return Directed edge going from this node to the parameter node, or * undirected edge if it exists, else null. */ T getEdgeToward(Node node); /** * Retrieves an edge that leaves this node toward the node with given index. *

* This method selects only edges leaving this node an pointing at the * parameter node (this also selects undirected edges). *

*

* This method is implicitly generic and returns something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeToward(...);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param index * Index of the target node. * @return Directed edge going from this node to the parameter node, or * undirected edge if it exists, else null. * @throws IndexOutOfBoundsException * if the index is negative or greater than {@code * getNodeCount() - 1}. */ T getEdgeToward(int index) throws IndexOutOfBoundsException; /** * Retrieves an edge that leaves given node toward this node. *

* This method selects only edges leaving the other node an pointing at this * node (this also selects undirected edges). *

*

* This method is implicitly generic and returns something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeFrom(...);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param node * The source node. * @return Directed edge going from the parameter node to this node, or * undirected edge if it exists, else null. */ T getEdgeFrom(Node node); /** * Retrieves an edge that leaves node with given index toward this node. *

* This method selects only edges leaving the other node an pointing at this * node (this also selects undirected edges). *

*

* This method is implicitly generic and returns something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeFrom("...");
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param index * Index of the source node. * @return Directed edge going from the parameter node to this node, or * undirected edge if it exists, else null. * @throws IndexOutOfBoundsException * if the index is negative or greater than {@code * getNodeCount() - 1}. */ T getEdgeFrom(int index) throws IndexOutOfBoundsException; /** * Retrieves an edge between this node and and another node if one exists. *

* This method selects directed or undirected edges. If the edge is * directed, its direction is not important and leaving or entering edges * will be selected. *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeBetween(...);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param node * The opposite node. * @return Edge between this node and the parameter node if it exists, else * null. */ T getEdgeBetween(Node node); /** * Retrieves an edge between this node and the node with index i if one * exists. *

* This method selects directed or undirected edges. If the edge is * directed, its direction is not important and leaving or entering edges * will be selected. *

*

* This method is implicitly generic and return something which extends * Edge. The return type is the one of the left part of the assignment. For * example, in the following call : * *

	 * ExtendedEdge e = node.getEdgeBetween(...);
	 * 
* * the method will return an ExtendedEdge. If no left part exists, method * will just return an Edge. *

* * @param index * The index of the opposite node. * @return Edge between node with index i and this node if it exists, else * null. * @throws IndexOutOfBoundsException * if the index is negative or greater than {@code * getNodeCount() - 1}. */ T getEdgeBetween(int index) throws IndexOutOfBoundsException; }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy