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 EReference
s 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 EReference s 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
EClass es) |
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 EReference
s 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)
EClass
es)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