public static QuiverWithPotential <int> GetOddFlowerQP(int numVerticesInCenterPolygon, int firstVertex = DefaultFirstVertex) { if (!OddFlowerParameterIsValid(numVerticesInCenterPolygon)) { throw new ArgumentOutOfRangeException(nameof(numVerticesInCenterPolygon)); } int numLayers = UsefulQuivers.GetNumberOfLayersInOddFlowerQuiver(numVerticesInCenterPolygon); int numVerticesInFullInnerLayer = 2 * numVerticesInCenterPolygon; int numVerticesInOuterLayer = 4 * numVerticesInCenterPolygon; var potential = new Potential <int>(); // Center polygon potential = potential.AddCycle(new DetachedCycle <int>(Enumerable.Range(firstVertex, numVerticesInCenterPolygon).AppendElement(firstVertex)), +1); // Full inner layers if (numLayers > 2) { // First layer (the squares and triangles between the first and second layers) var curLayer = GetLayerVertices(0); var nextLayer = GetLayerVertices(1); for (int indexInLayer = 0; indexInLayer < numVerticesInCenterPolygon; indexInLayer++) { var triangleVertices = new int[] { curLayer[indexInLayer], nextLayer[2 * indexInLayer - 1], nextLayer[2 * indexInLayer], curLayer[indexInLayer] }; potential = potential.AddCycle(new DetachedCycle <int>(triangleVertices), +1); var squareVertices = new int[] { curLayer[indexInLayer], curLayer[indexInLayer + 1], nextLayer[2 * indexInLayer + 1], nextLayer[2 * indexInLayer], curLayer[indexInLayer] }; potential = potential.AddCycle(new DetachedCycle <int>(squareVertices), -1); } // Remaining layers (only squares) for (int layerIndex = 1; layerIndex < numLayers - 2; layerIndex++) // 0-based layer index { curLayer = GetLayerVertices(layerIndex); nextLayer = GetLayerVertices(layerIndex + 1); for (int indexInLayer = 0; indexInLayer < numVerticesInFullInnerLayer; indexInLayer++) { int sign = (layerIndex + indexInLayer).Modulo(2) == 1 ? +1 : -1; var squareVertices = sign == +1 ? new int[] { curLayer[indexInLayer + 1], curLayer[indexInLayer], nextLayer[indexInLayer], nextLayer[indexInLayer + 1], curLayer[indexInLayer + 1] } : new int[] { curLayer[indexInLayer], curLayer[indexInLayer + 1], nextLayer[indexInLayer + 1], nextLayer[indexInLayer], curLayer[indexInLayer] }; potential = potential.AddCycle(new DetachedCycle <int>(squareVertices), sign); } } } // Outer layer { int layerIndex = numLayers - 2; var curLayer = GetLayerVertices(layerIndex); var nextLayer = GetLayerVertices(layerIndex + 1); if (numLayers == 2) { // Add pentagons and squares in this degenerate case for (int indexInLayer = 0; indexInLayer < curLayer.Count; indexInLayer++) { var squareVertices = new int[] { curLayer[indexInLayer], nextLayer[4 * indexInLayer - 2], nextLayer[4 * indexInLayer - 1], nextLayer[4 * indexInLayer], curLayer[indexInLayer] }; potential = potential.AddCycle(new DetachedCycle <int>(squareVertices), +1); var pentagonVertices = new int[] { curLayer[indexInLayer], curLayer[indexInLayer + 1], nextLayer[4 * indexInLayer + 2], nextLayer[4 * indexInLayer + 1], nextLayer[4 * indexInLayer], curLayer[indexInLayer] }; potential = potential.AddCycle(new DetachedCycle <int>(pentagonVertices), -1); } } else { // Add pentagons in the non-degenerate case for (int indexInLayer = 0; indexInLayer < curLayer.Count; indexInLayer++) { int sign = (layerIndex + indexInLayer).Modulo(2) == 1 ? +1 : -1; var cycleVertices = sign == +1 ? new int[] { curLayer[indexInLayer + 1], curLayer[indexInLayer], nextLayer[2 * indexInLayer], nextLayer[2 * indexInLayer + 1], nextLayer[2 * indexInLayer + 2], curLayer[indexInLayer + 1] } : new int[] { curLayer[indexInLayer], curLayer[indexInLayer + 1], nextLayer[2 * indexInLayer + 2], nextLayer[2 * indexInLayer + 1], nextLayer[2 * indexInLayer], curLayer[indexInLayer] }; potential = potential.AddCycle(new DetachedCycle <int>(cycleVertices), sign); } } } var qp = new QuiverWithPotential <int>(potential); return(qp); CircularList <int> GetLayerVertices(int layerIndex) => new CircularList <int>(GetVerticesInOddFlowerQPLayer(numVerticesInCenterPolygon, layerIndex, firstVertex)); }
public static int GetNumberOfLayersInOddFlowerQP(int numVerticesInCenterPolygon) => UsefulQuivers.GetNumberOfLayersInOddFlowerQuiver(numVerticesInCenterPolygon);