public class DijkstraSolver
extends java.lang.Object
Applied to EMF models, nodes are EClass elements and links are EReference elements.
We consider the distance between two nodes as the number of EReferences existing between
such nodes (or infinite if there is not a path).
This code has been adapted from the one published by Lars Vogel published here
| Modifier and Type | Field and Description |
|---|---|
private java.util.Map<org.eclipse.emf.ecore.EClass,java.lang.Integer> |
distance
Distance matrix between each pair of nodes
|
private java.util.List<org.eclipse.emf.ecore.EReference> |
edges
The list of edges of the graph
|
private java.util.List<org.eclipse.emf.ecore.EClass> |
nodes
The list of nodes of the graph
|
private java.util.Map<org.eclipse.emf.ecore.EClass,org.eclipse.emf.ecore.EClass> |
predecessors
The list of predecesors in the set of calculated paths
|
private java.util.Set<org.eclipse.emf.ecore.EClass> |
settledNodes
Visited nodes
|
private java.util.Set<org.eclipse.emf.ecore.EClass> |
unSettledNodes
Unvisited nodes
|
| Constructor and Description |
|---|
DijkstraSolver(org.eclipse.emf.ecore.EPackage ePackage)
Constructs a new Dijkstra solver taking all the
EClass elements as nodes and
their EReferences as references/links between the nodes. |
| Modifier and Type | Method and Description |
|---|---|
void |
execute(org.eclipse.emf.ecore.EClass source)
Executes the algorithm to create the auciliar table with all the possible
shortest paths
|
private void |
findMinimalDistances(org.eclipse.emf.ecore.EClass node)
Looks for the minimal distance between two nodes given a source node (as
EClass elements) |
private int |
getDistance(org.eclipse.emf.ecore.EClass node,
org.eclipse.emf.ecore.EClass target)
Returns the distance between two nodes (as
EClass elements) |
private org.eclipse.emf.ecore.EClass |
getMinimum(java.util.Set<org.eclipse.emf.ecore.EClass> vertexes)
Obtained the nearest node of a set of nodes (as
EClasses) |
private java.util.List<org.eclipse.emf.ecore.EClass> |
getNeighbors(org.eclipse.emf.ecore.EClass node)
Returns the list of neighbors for a given node.
|
java.util.LinkedList<org.eclipse.emf.ecore.EClass> |
getPath(org.eclipse.emf.ecore.EClass target)
Gets the path to a node as a list of
EClass elements to be crossed. |
private int |
getShortestDistance(org.eclipse.emf.ecore.EClass destination)
Calculates the shortest distance with regard to a ndoe (as
EClass) |
private boolean |
isSettled(org.eclipse.emf.ecore.EClass vertex)
Checks if a node has already been visited by the algorithm
|
private final java.util.List<org.eclipse.emf.ecore.EClass> nodes
private final java.util.List<org.eclipse.emf.ecore.EReference> edges
private java.util.Set<org.eclipse.emf.ecore.EClass> settledNodes
private java.util.Set<org.eclipse.emf.ecore.EClass> unSettledNodes
private java.util.Map<org.eclipse.emf.ecore.EClass,org.eclipse.emf.ecore.EClass> predecessors
private java.util.Map<org.eclipse.emf.ecore.EClass,java.lang.Integer> distance
public DijkstraSolver(org.eclipse.emf.ecore.EPackage ePackage)
EClass elements as nodes and
their EReferences as references/links between the nodes.ePackage - The metamodel (as EPackage)public void execute(org.eclipse.emf.ecore.EClass source)
source - The source element of the path (as EClass)private void findMinimalDistances(org.eclipse.emf.ecore.EClass node)
EClass elements)node - The source node to start the calculation (as EClass)private int getDistance(org.eclipse.emf.ecore.EClass node,
org.eclipse.emf.ecore.EClass target)
EClass elements)node - The sourcce node (as EClass)target - The target node (as EClass)Integer.MAX_VALUE)private java.util.List<org.eclipse.emf.ecore.EClass> getNeighbors(org.eclipse.emf.ecore.EClass node)
As we deal with EClass elements, the neighbors of an EClass are all the EClass
elements linked with at least one EReference.
node - The target nodeEClass elements)private org.eclipse.emf.ecore.EClass getMinimum(java.util.Set<org.eclipse.emf.ecore.EClass> vertexes)
EClasses)vertexes - The set of nodes (as EClass)EClass)private boolean isSettled(org.eclipse.emf.ecore.EClass vertex)
vertex - The node (as EClass)private int getShortestDistance(org.eclipse.emf.ecore.EClass destination)
EClass)destination - The target node (as EClass)Integer.MAX_VALUE)public java.util.LinkedList<org.eclipse.emf.ecore.EClass> getPath(org.eclipse.emf.ecore.EClass target)
EClass elements to be crossed.target - The target element to visit (as EClass)EClass elements