blob: 2e77512a007c15498a0212057bdb495693fc6c41 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.analysis.graph.core.criticalpath;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.graph.core.base.IGraphWorker;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfEdge;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfGraph;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex.EdgeDirection;
import org.eclipse.tracecompass.analysis.graph.core.criticalpath.ICriticalPathAlgorithm;
/**
* Abstract class for critical path algorithms
*
* @author Francis Giraldeau
*/
public abstract class AbstractCriticalPathAlgorithm implements ICriticalPathAlgorithm {
private final TmfGraph fGraph;
/**
* Constructor
*
* @param graph
* The graph on which to calculate critical path
*/
public AbstractCriticalPathAlgorithm(TmfGraph graph) {
fGraph = graph;
}
/**
* Get the graph
*
* @return the graph
*/
public TmfGraph getGraph() {
return fGraph;
}
/**
* Copy link of type TYPE between nodes FROM and TO in the graph PATH. The
* return value is the tail node for the new path.
*
* @param criticalPath
* The graph on which to add the link
* @param graph
* The original graph on which to calculate critical path
* @param anchor
* The anchor vertex from the path graph
* @param from
* The origin vertex in the main graph
* @param to
* The destination vertex in the main graph
* @param ts
* The timestamp of the edge
* @param type
* The type of the edge to create
* @param string
* An optional qualifier for the link
* @return The destination vertex in the path graph
*/
protected TmfVertex copyLink(TmfGraph criticalPath, TmfGraph graph, TmfVertex anchor, TmfVertex from, TmfVertex to, long ts, TmfEdge.EdgeType type, @Nullable String string) {
IGraphWorker parentFrom = graph.getParentOf(from);
IGraphWorker parentTo = graph.getParentOf(to);
if (parentTo == null) {
throw new NullPointerException();
}
TmfVertex tmp = new TmfVertex(ts);
criticalPath.add(parentTo, tmp);
if (parentFrom == parentTo) {
anchor.linkHorizontal(tmp, type, string);
} else {
anchor.linkVertical(tmp, type, string);
}
return tmp;
}
/**
* Find the next incoming vertex from another object (in vertical) from a
* node in a given direction
*
* @param vertex
* The starting vertex
* @param dir
* The direction in which to search
* @return The next incoming vertex
*/
public static @Nullable TmfVertex findIncoming(TmfVertex vertex, EdgeDirection dir) {
TmfVertex currentVertex = vertex;
while (true) {
TmfEdge incoming = currentVertex.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE);
if (incoming != null) {
return currentVertex;
}
TmfEdge edge = currentVertex.getEdge(dir);
if (edge == null || edge.getType() != TmfEdge.EdgeType.EPS) {
break;
}
currentVertex = TmfVertex.getNeighborFromEdge(edge, dir);
}
return null;
}
@Override
public String getID() {
return getClass().getName();
}
@Override
public String getDisplayName() {
return getClass().getSimpleName();
}
}