1 #Region "Microsoft.VisualBasic::e187405e85168b51ae932394e6f3a296, Microsoft.VisualBasic.Core\ComponentModel\DataStructures\Tree\BinaryTree\ClusterParts.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Module ClusterParts
35     
36     '         Function: __addCluster, ClusterParts
37     '         Delegate Function
38     
39     
40     '         Delegate Function
41     
42     '             Function: __hashLeaf
43     
44     '             Sub: __continuteCluster
45     
46     
47     
48     
49     
50     ' /********************************************************************************/
51
52 #End Region
53
54 Imports System.Runtime.CompilerServices
55 Imports Microsoft.VisualBasic.CommandLine.Reflection
56
57 Namespace ComponentModel.DataStructures.BinaryTree
58
59     Public Module ClusterParts
60
61         Public Const PATH As String = "Path"
62         Public Const LEAF_NODE As String = "Leaf"
63         Public Const LEAF_X As String = "Leaf-X"
64         Public Const ROOT As String = "ROOT"
65
66         ''' <summary>
67         ''' {最开始的节点,实体列表}
68         ''' </summary>
69         ''' <returns></returns>
70         <ExportAPI("Cluster.Parts")>
71         <Extension>
72         Public Function ClusterParts(Of T)(tree As BinaryTree(Of T),
73                                            isLeaf As IsType(Of T),
74                                            isLeafX As IsType(Of T),
75                                            GetEntities As GetEntities(Of T)) As Dictionary(Of StringString())
76
77             Dim ROOT As TreeNode(Of T) = tree.FindSymbol(BinaryTree.ClusterParts.ROOT)
78             Dim hash As Dictionary(Of StringString()) = New Dictionary(Of StringString())
79             For Each x In ROOT.GetEnumerator
80                 Call x.__addCluster(hash, isLeaf, isLeafX, GetEntities)
81             Next
82             Return hash
83         End Function
84
85         <Extension> Private Function __addCluster(Of T)(node As TreeNode(Of T),
86                                                         ByRef hash As Dictionary(Of StringString()),
87                                                         isLeaf As IsType(Of T),
88                                                         isLeafX As IsType(Of T),
89                                                         GetEntities As GetEntities(Of T)) As Dictionary(Of StringString())
90             Dim list As New List(Of String)
91
92             For Each x In node.GetEnumerator
93                 If x.__hashLeaf(isLeaf, isLeafX) Then
94                     Dim leafs As New List(Of String)
95                     Call x.__continuteCluster(hash, leafs, isLeaf, isLeafX, GetEntities)
96                     Call list.AddRange(leafs)
97                 Else
98                     Call x.__addCluster(hash, isLeaf, isLeafX, GetEntities)
99                 End If
100             Next
101
102             If list.Count > 0 Then
103                 Call hash.Add(node.Name, list.Distinct.ToArray)
104             End If
105
106             Return hash
107         End Function
108
109         Public Delegate Function IsType(Of T)(node As TreeNode(Of T)) As Boolean
110         Public Delegate Function GetEntities(Of T)(node As TreeNode(Of T)) As String()
111
112         <Extension> Private Sub __continuteCluster(Of T)(node As TreeNode(Of T),
113                                                          ByRef hash As Dictionary(Of StringString()),
114                                                          ByRef list As List(Of String),
115                                                          isLeaf As IsType(Of T),
116                                                          isLeafX As IsType(Of T),
117                                                          GetEntities As GetEntities(Of T))
118             For Each x As TreeNode(Of T) In node.GetEnumerator
119                 If isLeaf(x) OrElse isLeafX(x) Then
120                     Dim leafs As String() = GetEntities(x)
121                     Call list.AddRange(leafs)
122                 ElseIf x.__hashLeaf(isLeaf, isLeafX) Then
123                     Call x.__continuteCluster(hash, list, isLeaf, isLeafX, GetEntities)
124                 Else
125                     Call x.__addCluster(hash, isLeaf, isLeafX, GetEntities)
126                 End If
127             Next
128         End Sub
129
130         ''' <summary>
131         ''' 最远只允许隔着一层Path,这些就可以看作为一个cluster
132         ''' </summary>
133         ''' <param name="node"></param>
134         ''' <returns></returns>
135         <Extension> Private Function __hashLeaf(Of T)(node As TreeNode(Of T), isLeaf As IsType(Of T), isLeafX As IsType(Of T)) As Boolean
136             For Each x In node.GetEnumerator
137                 If isLeaf(x) OrElse isLeafX(x) Then
138                     Return True
139                 End If
140                 'For Each y In x.GetEnumerator
141                 '    If TypeOf y Is Leaf OrElse TypeOf x Is LeafX Then
142                 '        Return True
143                 '    End If
144                 'Next
145             Next
146             Return False
147         End Function
148     End Module
149 End Namespace