/// <summary> /// list musí mít 63 a méně vrcholů /// </summary> /// <param name="list"></param> /// <returns></returns> public long VerticesToState(IList <VertexStack> list) { return(LongBinaryStatesWithHashSet.VerticesToStateStatic(list)); }
/// <summary> /// Builds a full triarc in this.triarc following sequence of boundary from constructor. /// </summary> private void reconstructTriarc() { List <VertexStack> active = triarc.ActiveVertices(); long boundaryFromActive = (LongBinaryStatesWithHashSet.VerticesToStateStatic(active)).BoundaryToStandardizedForm(); int countOfActiveWithLessThanThreeNeighbours = CountOfVerticesWithLessThanThreeNeighbours(active); #region if triarc has been finished if (countOfActiveWithLessThanThreeNeighbours == 0 && triarc.FaceSizes.Contains(active.Count)) { triarc.Faces.Add(active.Select(x => x.ID).ToList()); Console.WriteLine("Triarc has been found, reconstructed and will be saved."); ExtractResult(); if (Global.Count3Connectivity) { var conn = "Graph " + (ReconstructionGraph.ThreeConnected.IsGraph3Connected(triarc) ? "is" : "isn't") + " 3-connected"; Console.WriteLine(conn); } found = true; return; } #endregion //If this state isn't the one solution suggests. if (boundaryFromActive != SequenceOfStatesLeadingToResult.Last() || (countOfActiveWithLessThanThreeNeighbours == 0)) { return; //jsme ve špatné větvi výpočtu } //Else remove it to signal that it has been gone trough. SequenceOfStatesLeadingToResult.RemoveAt(SequenceOfStatesLeadingToResult.Count - 1); SequencesOfVerticesLeaidngToResult.Add(string.Join <string>(", ", active.Select( x => { return(x.ID.ToString() + (x.HasAllThreeNeighbours() == true ? "out" : "in")); }))); #region If there is a restriction on maximal count of vertices, defaultly set to int.maxValue if (triarc.CountOfVertices > maxNumberOfVertices) { Console.WriteLine("Triarc won't be reconstructed due to having more vertices than allowed."); Console.WriteLine("The limit is set to " + maxNumberOfVertices); return; } #endregion states.Add(active); if (countOfActiveWithLessThanThreeNeighbours > 1 && !found) { var selectWhatToChange = OrderOfExecution(SelectWhatToChange(active).ToArray()); foreach (var selected in selectWhatToChange) { //Conditional debug statements // WriteDepthAndVertices(active, "active ", true, depth); // WriteDepthAndVertices(selected, "selected ", false, depth); foreach (var faceSize in triarc.FaceSizes) { //Skips invalid states if (triarc.FaceSizes[triarc.FaceSizes.Count - 1] < selected.Count) { return; } //Skips invalid state if (faceSize < selected.Count) { continue; } //Prevents multipleEdges and loops if ((selected[0].A == selected[selected.Count - 1] || selected[0].B == selected[selected.Count - 1]) && selected.Count == faceSize) { continue; } int NumberOfVerticesInTriarc = triarc.CountOfVertices; int localRoot = triarc.ActiveRootID; List <VertexStack> replacedBy; Replace(selected, out replacedBy, faceSize); //Conditional debug statements. // WriteDepthAndVertices(replacedBy, "replaced by", false, depth); triarc.ActiveRootID = selected[0].ID; List <VertexStack> activeNew = triarc.ActiveVertices(); string localDepth = depth; depth += "."; //Recursive calling reconstructTriarc(); depth = localDepth; if (found) { return; } //Undo changes done by this method before returning triarc.Faces.RemoveAt(triarc.Faces.Count - 1); foreach (var item in selected) { item.Pop(); } triarc.vertices.RemoveRange(NumberOfVerticesInTriarc, faceSize - selected.Count); triarc.CountOfVertices = NumberOfVerticesInTriarc; triarc.ActiveRootID = localRoot; } } } }