Skip to content
Snippets Groups Projects
Commit 11c60e6e authored by Paul Nitzke's avatar Paul Nitzke
Browse files

Merge branch 'performance' into 'master'

Fix: Cache ColorsUsed for huge performance boost

See merge request !39
parents 7553d819 3313bfd7
No related branches found
No related tags found
1 merge request!39Fix: Cache ColorsUsed for huge performance boost
......@@ -8,17 +8,20 @@ namespace SparseTransform.Convert
/// </summary>
public class ColoredDotWriter : DotWriter
{
private IGraph _coloredGraph;
private bool _textcolor;
private int _colorsUsed;
private int _hueFactor;
/// <summary>
/// Constructor constructing a color-dictionary for coloring purpose.
/// </summary>
/// <param name="textColor">decision whether the labels should be colored or labelled.</param>
public ColoredDotWriter(IGraph graph, bool textColor)
{
this._coloredGraph = graph;
this._colorsUsed = graph.ColorsUsed;
this._textcolor = textColor;
// This is the offset for coloring. Less colors = more distance between. Cached for NodeLabel.
this._hueFactor = 255 / this._colorsUsed;
}
/// <summary>
......@@ -29,10 +32,8 @@ namespace SparseTransform.Convert
/// <returns></returns>
public override String NodeLabel(GraphNode node, String prefix)
{
// This is the offset. Less colors = more distance between
int hueFactor = 255 / _coloredGraph.ColorsUsed;
// Calculate the hue. We modulo with 255 to not exceed spectrum. Then convert to float for DOT
double hue = Math.Round((double)((node.Color * hueFactor) % 255) / 255, 3);
double hue = Math.Round((double)((node.Color * _hueFactor) % 255) / 255, 3);
StringBuilder label = new StringBuilder();
// Append label name and general layout info
......@@ -41,7 +42,7 @@ namespace SparseTransform.Convert
// If current node is colored, apply either text label with color or set fill color
if (node.Colored)
{
if (_textcolor || _coloredGraph.ColorsUsed > 255)
if (_textcolor || this._colorsUsed > 255)
{
label.Append($", label=\"{prefix}{node.Index}\\n color:{node.Color}\"");
}
......
......@@ -45,6 +45,7 @@ namespace SparseTransform.DataStructures
}
}
private int _colorsUsed = 0;
/// <summary>
/// Number of colors used for coloring.
/// </summary>
......@@ -52,20 +53,24 @@ namespace SparseTransform.DataStructures
{
get
{
List<int> colors = new List<int>();
if (Colored)
if (this._colorsUsed == 0)
{
foreach (GraphNode node in _nodes)
List<int> colors = new List<int>();
if (Colored)
{
int color = node.Color;
// Do not check for != 0 since we already know everything here is colored
if (!colors.Contains(color))
foreach (GraphNode node in _nodes)
{
colors.Add(color);
int color = node.Color;
// Do not check for != 0 since we already know everything here is colored
if (!colors.Contains(color))
{
colors.Add(color);
}
}
}
this._colorsUsed = colors.Count;
}
return colors.Count;
return this._colorsUsed;
}
}
......@@ -79,7 +84,7 @@ namespace SparseTransform.DataStructures
public void AddEdge(int i, int j)
{
if(i != j)
if (i != j)
{
GraphNode iNode = AddNode(i);
GraphNode jNode = AddNode(j);
......
......@@ -88,6 +88,7 @@ namespace SparseTransform.DataStructures
}
}
private int _colorsUsed = 0;
/// <summary>
/// Number of colors used for coloring. Works if either or both sides are colored
/// </summary>
......@@ -95,32 +96,38 @@ namespace SparseTransform.DataStructures
{
get
{
List<int> colors = new List<int>();
if (LeftColored)
if (_colorsUsed == 0)
{
foreach (GraphNode node in _leftNodes)
List<int> colors = new List<int>();
if (LeftColored)
{
int color = node.Color;
// Do not check for != 0 since we already know everything here is colored
if (!colors.Contains(color))
foreach (GraphNode node in _leftNodes)
{
colors.Add(color);
int color = node.Color;
// Do not check for != 0 since we already know everything here is colored
if (!colors.Contains(color))
{
colors.Add(color);
}
}
}
}
if (RightColored)
{
foreach (GraphNode node in _rightNodes)
if (RightColored)
{
int color = node.Color;
// Do not check for != 0 since we already know everything here is colored
if (!colors.Contains(color))
foreach (GraphNode node in _rightNodes)
{
colors.Add(color);
int color = node.Color;
// Do not check for != 0 since we already know everything here is colored
if (!colors.Contains(color))
{
colors.Add(color);
}
}
}
this._colorsUsed = colors.Count;
}
return colors.Count;
return _colorsUsed;
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment