HyperGraph

Details

diff --git a/HyperGraphModel/HyperGraph.cs b/HyperGraphModel/HyperGraph.cs
index 1879d28..9d03ac4 100644
--- a/HyperGraphModel/HyperGraph.cs
+++ b/HyperGraphModel/HyperGraph.cs
@@ -9,10 +9,12 @@ namespace HyperGraphModel
     public class HyperGraph
     {
         public List<List<string>> HyperEdge;
+        public int SameVertCount;
 
-        public HyperGraph(Matrix<int> matrix)
+        public HyperGraph(Matrix<int> matrix, int sameVertCount, bool swapLastEdge = false)
         {
             HyperEdge = new List<List<string>>();
+            SameVertCount = sameVertCount;
 
             //  По ребрам (столбцам)
             for (int j = 0; j < matrix.countColumn; j++)
@@ -25,12 +27,20 @@ namespace HyperGraphModel
                         HyperEdge[j].Add("v" + i);
                 }
             }
+
+            if (swapLastEdge && HyperEdge.Any() && HyperEdge.Any(x => x.Any()))
+            {
+                var swapVert = HyperEdge.Last().Take(SameVertCount);
+                HyperEdge[HyperEdge.Count - 1] = HyperEdge.Last().Skip(SameVertCount).ToList();
+                HyperEdge[HyperEdge.Count - 1].AddRange(swapVert);
+            }
         }
 
         //  Конструктор копирования
         public HyperGraph(HyperGraph graph)
         {
             HyperEdge = new List<List<string>>();
+            SameVertCount = graph.SameVertCount;
 
             foreach (var edge in graph.HyperEdge)
             {
diff --git a/HyperGraphModel/Theorem.cs b/HyperGraphModel/Theorem.cs
index 1a13edf..37e92ff 100644
--- a/HyperGraphModel/Theorem.cs
+++ b/HyperGraphModel/Theorem.cs
@@ -241,19 +241,22 @@ namespace HyperGraphModel
             else
             {
                 count = 2 * (X - m * k) * Pow((n - 2 * k), m - 1);
-                for (int i = 1; i < n - 2 * k - 1; i++)
+                for (int i = 1; i < n - 2 * k; i++)
                 {
                     count *= Pow((n - 2 * k - i), m) * Pow(Factorial(k), m);
                 }
             }
 
-
+            //foreach (var edge in graph.HyperEdge)
+            //    foreach (var same in Pain.Keys)
+            //        foreach (var vert in same)
+            //            edge.RemoveAll(s => s.Equals(vert));
 
             TheoremAuto result = new TheoremAuto
             {
                 isSatisfyTheorem = true,//(intersect.Count > 0) ? true : false,
                 CountAutomorphism = count,
-                AutomorphismNodes = null,
+                AutomorphismNodes = Pain.Keys.OfType<object>().ToList(),
                 GraphWithoutAutoEdges = graph
             };
             //  Вовращаемое значение в виде структуры

WPF/ClassDiagram.cd 62(+62 -0)

diff --git a/WPF/ClassDiagram.cd b/WPF/ClassDiagram.cd
new file mode 100644
index 0000000..a1570a5
--- /dev/null
+++ b/WPF/ClassDiagram.cd
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1">
+  <Class Name="WPF.Common.WPF.Converters.StatusToColorConverter" BaseTypeListCollapsed="true">
+    <Position X="3.75" Y="7.25" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAIAAAAAAAAgAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Common\WPF\Converters\StatusToColorConverter.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" Collapsed="true" />
+  </Class>
+  <Class Name="WPF.Model.Calculate">
+    <Position X="3.5" Y="8.75" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAAAAAFAAACAAAAAgAEAAABACAAAA=</HashCode>
+      <FileName>Model\Calculate.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="WPF.Common.WPF.BaseViewModel">
+    <Position X="2" Y="0.5" Width="2.75" />
+    <TypeIdentifier>
+      <HashCode>AAAAAAAAAAAAAAAAKAAAAAAAgAEAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Common\WPF\BaseViewModel.cs</FileName>
+    </TypeIdentifier>
+    <Lollipop Position="0.2" />
+  </Class>
+  <Class Name="WPF.Common.WPF.ModifyViewModel">
+    <Position X="3.75" Y="3.5" Width="1.75" />
+    <TypeIdentifier>
+      <HashCode>AAMACIEAAAAAAAAAAAAAAEAAAAAAAAAAAAoAAAAAAAA=</HashCode>
+      <FileName>Common\WPF\ModifyViewModel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="WPF.ViewModel.MainViewModel">
+    <Position X="5.75" Y="0.5" Width="2.25" />
+    <TypeIdentifier>
+      <HashCode>AMAJOASEGQABBMgGAUKAIAcDAEgIyAFYAAAhFIAIAAA=</HashCode>
+      <FileName>ViewModel\MainViewModel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Class Name="WPF.ViewModel.VertViewModel">
+    <Position X="1.5" Y="3.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>ABAAAAAAAAAAAAgAAAAAAAAAAAACgAAAAAAgAAAAAAA=</HashCode>
+      <FileName>ViewModel\MainViewModel.cs</FileName>
+    </TypeIdentifier>
+  </Class>
+  <Enum Name="WPF.Common.Status">
+    <Position X="1.5" Y="8.5" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AJAAAAAAAAAAAQAAAAAAIBAAAAAIAAAAAABAAAAAgAA=</HashCode>
+      <FileName>Common\Parameters\Status.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Enum Name="WPF.Model.EnumTheorem">
+    <Position X="1.5" Y="6.75" Width="1.5" />
+    <TypeIdentifier>
+      <HashCode>AAAAgAAAAAAAAAAAAAAAAAIAIAAAAAAAAAAAAAAAAQA=</HashCode>
+      <FileName>Model\EnumTheorem.cs</FileName>
+    </TypeIdentifier>
+  </Enum>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
\ No newline at end of file

WPF/Model/Calculate.cs 115(+111 -4)

diff --git a/WPF/Model/Calculate.cs b/WPF/Model/Calculate.cs
index 47937f8..d1bd857 100644
--- a/WPF/Model/Calculate.cs
+++ b/WPF/Model/Calculate.cs
@@ -16,7 +16,7 @@ namespace WPF.Model
     public static class Calculate
     {
         //  Статичный объект гиперграф
-        public static HyperGraph Graph { get; private set; } = new HyperGraph(new Matrix<int>());
+        public static HyperGraph Graph { get; private set; } = new HyperGraph(new Matrix<int>(), 0);
 
         /// <summary>
         /// Создание и наполнение гиперграфа по вводным данным
@@ -73,7 +73,7 @@ namespace WPF.Model
                     }
                 }
 
-                Graph = new HyperGraph(matrix);
+                Graph = new HyperGraph(matrix, SameVert, swapLastEdge: SelectedTheorem == EnumTheorem.Forth || SelectedTheorem == EnumTheorem.Fifth);
             }
             catch (Exception e)
             {
@@ -161,7 +161,10 @@ namespace WPF.Model
                     }
                 case EnumTheorem.Fifth:
                     {
-                        //  Для пятой теоремы нет метода вывода
+                        using (StreamWriter sw = new StreamWriter(memoryStream))
+                        {
+                            ExportTheoremaFifth(result, sw);
+                        }
                         break;
                     }
             }
@@ -428,7 +431,7 @@ namespace WPF.Model
         /// <param name="output">Поток вывода</param>
         static void ExportTheoremaForth(TheoremAuto result, StreamWriter output)
         {
-            //  Выполняется ли условие согласно теореме 3
+            //  Выполняется ли условие согласно теореме 4
             output.WriteLine("Согласно теореме 4: " + result.isSatisfyTheorem);
             //  Если да, то вывести
             if (result.isSatisfyTheorem)
@@ -512,6 +515,110 @@ namespace WPF.Model
             }
         }
 
+        /// <summary>
+        /// Вывод результата пятой теоремы
+        /// </summary>
+        /// <param name="result">Результат расчета</param>
+        /// <param name="output">Поток вывода</param>
+        static void ExportTheoremaFifth(TheoremAuto result, StreamWriter output)
+        {
+            //  Выполняется ли условие согласно теореме 5
+            output.WriteLine("Согласно теореме 5: " + result.isSatisfyTheorem);
+            //  Если да, то вывести
+            if (result.isSatisfyTheorem)
+            {
+                List<List<string>> AutomorphismNodesList = (result.AutomorphismNodes as List<object>).OfType<List<string>>().ToList();
+                var sameVertCount = AutomorphismNodesList.First().Count;
+                var length = result.GraphWithoutAutoEdges.HyperEdge.Count;
+
+                List<string> automorphism = new List<string>();
+
+                
+                List<int> _default = new List<int>();
+                for (int i = 0; i < length; i++)
+                    _default.Add(i);
+                List<List<int>> comboEdges = new List<List<int>>()
+                {
+                    _default
+                };
+
+                
+                for (int l = 0; l < length; l++)
+                {
+                    if (l > 0)
+                    {
+                        // swap edge
+                        var swap = new List<int>(comboEdges[comboEdges.Count - 2]);
+                        var item = swap.Last();
+                        swap = swap.Take(swap.Count - 1).ToList();
+                        swap.Insert(0, item);
+                        comboEdges.Add(swap);
+                    }
+                    var reverse = new List<int>(comboEdges.Last());
+                    reverse.Reverse();
+                    comboEdges.Add(reverse);
+                    // reverse
+                }
+
+                var comboVerticies = new Dictionary<int, List<List<string>>>();
+                int size = 0;
+                for (int i = 0; i < _default.Count; i++)
+                {
+                    var edge = new List<string>(result.GraphWithoutAutoEdges.HyperEdge[i]);
+                    var sameFirst = edge.Take(sameVertCount).ToList();
+                    var sameLast = edge.Skip(edge.Count - sameVertCount).ToList();
+                    edge = edge.Except(sameFirst).Except(sameLast).ToList();
+                    List<List<string>> transpos = Combinatorics<string>.Transposition(edge);
+                    transpos.Insert(0, edge);
+                    for (int j = 0; j < transpos.Count; j++)
+                    {
+                        transpos[j].InsertRange(0, sameFirst);
+                        transpos[j].AddRange(sameLast);
+                    }
+
+                    comboVerticies.Add(_default[i], transpos);
+                    size = transpos.Count;
+                }
+
+                var combination = Combinatorics<int>.CombinationWithReplays(size, length);
+
+                List<List<string>> djasd = new List<List<string>>();
+                //  Перебор всех перестановок последовательностей ребер
+                for (int k = 0; k < comboEdges.Count; k++)
+                {
+                    //  Для k-й перестановки ребер перебираем все возможные комбинации перестановок вершин
+                    for (int i = 0; i < combination.Count; i++)
+                    {
+                        var comb = combination[i];
+                        var splitEdges = new List<List<string>>(comb.Count);
+                        splitEdges.AddRange(comb.Select((t, j) => new List<string>(comboVerticies[comboEdges[k][j]][t])));
+
+                        if (!splitEdges.First().First().Equals(splitEdges.Last().Last()))
+                        {
+                            foreach (var t in splitEdges)
+                                t.Reverse();
+                        }
+                        var fullString = "(" + string.Join(") (", splitEdges.Select(lst => string.Join("-", lst))) + ")";
+
+                        //  Записываем строковый вид автоморфизма в общий список
+                        automorphism.Add(fullString);
+                    }
+                }
+
+                output.WriteLine("\r\nКоличество автоморфизмов: " + result.CountAutomorphism + "\r\n");
+
+                var y = automorphism.Distinct().ToList();
+                var ksmkd = (int) Math.Log10(automorphism.Count) + 1;
+                //  Вывод
+                for (int i = 0; i < automorphism.Count; i++)
+                {
+                    var iskf = String.Format("{0," + ksmkd + ":0}", i + 1);
+                    output.WriteLine(iskf + ") : " + automorphism[i]);
+                }
+
+            }
+        }
+
         #endregion
 
     }
diff --git a/WPF/ViewModel/MainViewModel.cs b/WPF/ViewModel/MainViewModel.cs
index f287353..9c673a3 100644
--- a/WPF/ViewModel/MainViewModel.cs
+++ b/WPF/ViewModel/MainViewModel.cs
@@ -49,13 +49,20 @@ namespace WPF.ViewModel
             //Verticies[3].Value = 6;
             //Verticies[4].Value = 2;
             //Verticies[5].Value = 7;
+            //EdgesNum = 4;
+            //SameVertNum = 2;
+            //Verticies[0].Value = 7;
+            //Verticies[1].Value = 5;
+            //Verticies[2].Value = 6;
+            //Verticies[3].Value = 8;
+            //SelectedTheorem = EnumTheorem.Forth;
             EdgesNum = 4;
-            SameVertNum = 2;
-            Verticies[0].Value = 7;
-            Verticies[1].Value = 5;
-            Verticies[2].Value = 6;
-            Verticies[3].Value = 8;
-            SelectedTheorem = EnumTheorem.Forth;
+            SameVertNum = 1;
+            Verticies[0].Value = 4;
+            Verticies[1].Value = 4;
+            Verticies[2].Value = 4;
+            Verticies[3].Value = 4;
+            SelectedTheorem = EnumTheorem.Fifth;
 #endif
 
         }
@@ -287,16 +294,9 @@ namespace WPF.ViewModel
                         break;
                     }
                 case EnumTheorem.Forth:
-                    {
-                        CanSave = true;
-                        KoeffForMinSameVert = 2;
-                        SameVertText = "Количество пересекающихся вершин";
-                        SameVertTextTooltip = "Подсказка. Количество вершин, являющихся общими между соседними ребрами";
-                        break;
-                    }
                 case EnumTheorem.Fifth:
                     {
-                        CanSave = false;
+                        CanSave = true;
                         KoeffForMinSameVert = 2;
                         SameVertText = "Количество пересекающихся вершин";
                         SameVertTextTooltip = "Подсказка. Количество вершин, являющихся общими между соседними ребрами";

WPF/WPF.csproj 1(+1 -0)

diff --git a/WPF/WPF.csproj b/WPF/WPF.csproj
index 3a8933b..7ab93e6 100644
--- a/WPF/WPF.csproj
+++ b/WPF/WPF.csproj
@@ -309,6 +309,7 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
+    <None Include="ClassDiagram.cd" />
     <None Include="packages.config" />
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>