Mercurial > defical
diff defical-sharp/libsemtd/label.cs @ 0:ebed2bd0d300
Initial import from svn. History be damned.
author | Edho P. Arief <me@myconan.net> |
---|---|
date | Fri, 02 Apr 2010 23:11:57 +0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/defical-sharp/libsemtd/label.cs Fri Apr 02 23:11:57 2010 +0700 @@ -0,0 +1,138 @@ +namespace libsemtd +{ + partial class Semtd + { + private void labelReset() + { + this.labelVer = new int[this.numVerMain]; + this.labelEdges = new int[this.numVerMain, this.numVerMain]; + this.labelEdgeAbsoluteMax = 2 * this.numVerTotal - 1; + this.labelEdgesUsed = new int[this.labelEdgeAbsoluteMax + 1]; + //this.scoreCache = -1; + } + private int labelRangeEdge() + { + labelRefreshEdgeMinMax(); + return this.labelEdgeMax - this.labelEdgeMin + 1; + } + private void labelRefreshEdgeMinMax() + { + for (int i = 1; i <= this.labelEdgeAbsoluteMax; i++) + { + if (this.labelEdgesUsed[i] > 0) + { + this.labelEdgeMin = i; + break; + } + } + for (int i = this.labelEdgeAbsoluteMax; i >= 1; i--) + { + if (this.labelEdgesUsed[i] > 0) + { + this.labelEdgeMax = i; + break; + } + } + } + private void labelRemoveVer(int posVer) + { + if (this.labelVer[posVer] > 0) + { + this.labelVer[posVer] = 0; + labelRemoveEdges(posVer); + } + } + private void labelRemoveEdges(int posVer) + { + for (int i = 0; i < this.numVerMain; i++) + { + if (this.labelVer[i] > 0 && i != posVer && this.graphConn[posVer, i]) + { + int labelOld = this.labelEdges[i, posVer]; + this.labelEdgesUsed[labelOld]--; + this.labelEdges[i, posVer] = this.labelEdges[posVer, i] = 0; + } + } + } + private void labelSetVer(int posVer, int labelVer) + { + if (this.labelVer[posVer] > 0) { labelRemoveVer(posVer); } + this.labelVer[posVer] = labelVer; + labelSetEdges(posVer); + } + private void labelSetEdges(int posVer) + { + int labelNew; + for (int i = 0; i < this.numVerMain; i++) + if (i != posVer && + this.graphConn[posVer, i] && + this.labelVer[i] > 0) + { + labelNew = this.labelVer[posVer] + this.labelVer[i]; + this.labelEdges[i, posVer] = this.labelEdges[posVer, i] = labelNew; + this.labelEdgesUsed[labelNew]++; + } + } + private bool isValidToLabel(int posVer, int labelVer) + { + for (int i = 0; i < this.numVerMain; i++) + { + if (this.graphConn[i, posVer] && + this.labelVer[i] > 0 && + this.labelEdgesUsed[this.labelVer[i] + labelVer] == 1) + { + return false; + } + } + return true; + } + private bool isSemt() + { + if (labelRangeEdge() == numEdges) + { + for (int i = this.labelEdgeMin; i <= this.labelEdgeMax; i++) + { + if (this.labelEdgesUsed[i] != 1) + { + return false; + } + } + return true; + } + return false; + } + private int minDef() + { + int ret = 0; + switch (this.graphType) + { + case "wheel": //source: dissertation[1] + switch (this.numVerMain) + { + case 3 | 4 | 6 | 7: + ret = 1; + break; + default: + ret = 2; + break; + } + break; + case "fan": //source: dissertation[1] + if (this.numVerMain <= 7) + ret = 0; + else + ret = 1; + break; + case "doublefan": //source: dissertation[1] + ret = (this.numVerMain - 1) / 2; + break; + default: + // ret = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(this.numEdges / 2))) + 2 - this.numVertices; + //break; + ret = -1; + break; + } + return ret; + } + } +} \ No newline at end of file