Detects SubstructureItems that represent the isolated cycles in the specified graph.
Remarks
A cycle is a simple edge path in which the first and last nodes are identical. The algorithm only considers cycles in which at most one edge connects a cycle node with the rest of the graph (i.e. isolated cycles that are connected with one edge). Furthermore, a cycle only consists of elements with the same edgeDirectedness and nodeTypes.
The edgeDirectedness is considered as follows: A substructure is only identified as such if all edges are either undirected or consistently directed with respect to the specified directedness.
- A directedness value of
1
indicates that the edge is considered to be directed from source to target. - A directedness value of
-1
indicates that the edge is considered to be directed from target to source. - A directedness value of
0
indicates that the edge is considered to be undirected.
Examples
// prepare the cycle detection algorithm
const algorithm = new CycleSubstructures()
// run the algorithm
const result = algorithm.run(graph)
// highlight the cycles
for (const cycle of result.cycles) {
for (const node of cycle.nodes) {
graph.setStyle(node, highlightNodeStyle)
}
for (const edge of cycle.edges) {
graph.setStyle(edge, highlightEdgeStyle)
}
}
// prepare the cycle detection algorithm
const algorithm = new CycleSubstructures({
// only nodes with the same tags can be a cycle
nodeTypes: (node: INode): any => node.tag,
})
// run the algorithm
const result = algorithm.run(graph)
// highlight the cycles
for (const cycle of result.cycles) {
for (const node of cycle.nodes) {
graph.setStyle(node, highlightNodeStyle)
}
for (const edge of cycle.edges) {
graph.setStyle(edge, highlightEdgeStyle)
}
}
Type Details
- yFiles module
- view-layout-bridge
3
.Constructors
Parameters
A map of options to pass to the method.
- minimumSize - number
- The minimum size of a cycle. This option sets the minimumSize property on the created object.
- nodeTypes - ItemMapping<INode,any>
- A mapping which maps the type of each node. This option either sets the value directly or recursively sets properties to the instance of the nodeTypes property on the created object.
- edgeDirectedness - ItemMapping<IEdge,number>
- A mapping that stores the directedness of the edges. This option either sets the value directly or recursively sets properties to the instance of the edgeDirectedness property on the created object.
- subgraphNodes - ItemCollection<INode>
- The collection of nodes which define a subset of the graph for the algorithms to work on. This option either sets the value directly or recursively sets properties to the instance of the subgraphNodes property on the created object.
- subgraphEdges - ItemCollection<IEdge>
- The collection of edges which define a subset of the graph for the algorithms to work on. This option either sets the value directly or recursively sets properties to the instance of the subgraphEdges property on the created object.
Properties
Gets or sets a mapping that stores the directedness of the edges.
Remarks
- the edge's directedness is greater than
0.0
and the edge is incoming (i.e. n is the edge's target), - the edge's directedness is smaller than
0.0
and the edge is outgoing (i.e. n is the edge's source), - or the edge's directedness is
0.0
(i.e. the edge is considered to be undirected).
Gets or sets the minimum size of a cycle.
Remarks
Cycles with fewer nodes are ignored.
Default is 3
.
3
.Gets or sets a mapping which maps the type of each node.
Remarks
An arbitrary object. Nodes returning equal objects are considered to be of the same type.
If none is provided, all nodes are considered as equal.
Gets or sets the collection of edges which define a subset of the graph for the algorithms to work on.
Remarks
If nothing is set, all edges of the graph will be processed.
If only the excludes are set, all edges in the graph except those provided in the excludes are processed.
Note that edges which start or end at nodes which are not in the subgraphNodes are automatically not considered by the algorithm.
ItemCollection<T> instances may be shared among algorithm instances and will be (re-)evaluated upon (re-)execution of the algorithm.
Examples
// prepare the cycle detection algorithm
const algorithm = new CycleSubstructures({
// Ignore edges without target arrow heads
subgraphEdges: {
excludes: (edge: IEdge): boolean =>
edge.style instanceof PolylineEdgeStyle &&
edge.style.targetArrow instanceof Arrow &&
edge.style.targetArrow.type === ArrowType.NONE,
},
})
// run the algorithm
const result = algorithm.run(graph)
// highlight the cycles
for (const cycle of result.cycles) {
for (const node of cycle.nodes) {
graph.setStyle(node, highlightNodeStyle)
}
for (const edge of cycle.edges) {
graph.setStyle(edge, highlightEdgeStyle)
}
}
Gets or sets the collection of nodes which define a subset of the graph for the algorithms to work on.
Remarks
If nothing is set, all nodes of the graph will be processed.
If only the excludes are set, all nodes in the graph except those provided in the excludes are processed.
ItemCollection<T> instances may be shared among algorithm instances and will be (re-)evaluated upon (re-)execution of the algorithm.
Examples
// prepare the cycle detection algorithm
const algorithm = new CycleSubstructures({
subgraphNodes: {
// only consider elliptical nodes in the graph
includes: (node: INode): boolean =>
node.style instanceof ShapeNodeStyle &&
node.style.shape === ShapeNodeShape.ELLIPSE,
// but ignore the first node, regardless of its shape
excludes: graph.nodes.first()!,
},
})
// run the algorithm
const result = algorithm.run(graph)
// highlight the cycles
for (const cycle of result.cycles) {
for (const node of cycle.nodes) {
graph.setStyle(node, highlightNodeStyle)
}
for (const edge of cycle.edges) {
graph.setStyle(edge, highlightEdgeStyle)
}
}
Methods
Returns a list of SubstructureItems that represent isolated cycles in the specified graph.
Remarks
A cycle only consists of elements with the same nodeTypes, i.e., nodes associated with equal objects. If no nodeTypes is specified, all nodes are considered to be of the same type.
The edgeDirectedness is considered as follows: A substructure is only identified as such if all edges are either undirected or consistently directed with respect to the specified directedness.
- A directedness value of
1
indicates that the edge is considered to be directed from source to target. - A directedness value of
-1
indicates that the edge is considered to be directed from target to source. - A directedness value of
0
indicates that the edge is considered to be undirected.
Parameters
A map of options to pass to the method.
- graph - IGraph
- The graph to find the substructures in.
Returns
- ↪CycleSubstructuresResult
- A list of SubstructureItems that represent the cycles.
Throws
- Exception({ name: 'InvalidOperationError' })
- If the algorithm can't create a valid result due to an invalid graph structure or wrongly configured properties.
Examples
// prepare the cycle detection algorithm
const algorithm = new CycleSubstructures()
// run the algorithm
const result = algorithm.run(graph)
// highlight the cycles
for (const cycle of result.cycles) {
for (const node of cycle.nodes) {
graph.setStyle(node, highlightNodeStyle)
}
for (const edge of cycle.edges) {
graph.setStyle(edge, highlightEdgeStyle)
}
}
// prepare the cycle detection algorithm
const algorithm = new CycleSubstructures({
// only nodes with the same tags can be a cycle
nodeTypes: (node: INode): any => node.tag,
})
// run the algorithm
const result = algorithm.run(graph)
// highlight the cycles
for (const cycle of result.cycles) {
for (const node of cycle.nodes) {
graph.setStyle(node, highlightNodeStyle)
}
for (const edge of cycle.edges) {
graph.setStyle(edge, highlightEdgeStyle)
}
}
3
.