HyperGraph
Changes
HyperGraphModel/HyperGraph.cs 12(+11 -1)
HyperGraphModel/Theorem.cs 9(+6 -3)
WPF/ClassDiagram.cd 62(+62 -0)
WPF/Model/Calculate.cs 115(+111 -4)
WPF/ViewModel/MainViewModel.cs 28(+14 -14)
WPF/WPF.csproj 1(+1 -0)
Details
HyperGraphModel/HyperGraph.cs 12(+11 -1)
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)
{
HyperGraphModel/Theorem.cs 9(+6 -3)
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
}
WPF/ViewModel/MainViewModel.cs 28(+14 -14)
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>