nysol-take 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +7 -0
  2. data/bin/mbiclique.rb +317 -0
  3. data/bin/mbipolish.rb +362 -0
  4. data/bin/mccomp.rb +235 -0
  5. data/bin/mclique.rb +295 -0
  6. data/bin/mclique2g.rb +105 -0
  7. data/bin/mcliqueInfo.rb +203 -0
  8. data/bin/mfriends.rb +202 -0
  9. data/bin/mgdiff.rb +252 -0
  10. data/bin/mhifriend.rb +456 -0
  11. data/bin/mhipolish.rb +465 -0
  12. data/bin/mitemset.rb +168 -0
  13. data/bin/mpal.rb +410 -0
  14. data/bin/mpolishing.rb +399 -0
  15. data/bin/msequence.rb +165 -0
  16. data/bin/mtra2g.rb +476 -0
  17. data/bin/mtra2gc.rb +360 -0
  18. data/ext/grhfilrun/extconf.rb +12 -0
  19. data/ext/grhfilrun/grhfilrun.c +85 -0
  20. data/ext/grhfilrun/src/_sspc.c +358 -0
  21. data/ext/grhfilrun/src/aheap.c +545 -0
  22. data/ext/grhfilrun/src/aheap.h +251 -0
  23. data/ext/grhfilrun/src/base.c +92 -0
  24. data/ext/grhfilrun/src/base.h +59 -0
  25. data/ext/grhfilrun/src/fstar.c +497 -0
  26. data/ext/grhfilrun/src/fstar.h +80 -0
  27. data/ext/grhfilrun/src/grhfil.c +214 -0
  28. data/ext/grhfilrun/src/itemset.c +713 -0
  29. data/ext/grhfilrun/src/itemset.h +170 -0
  30. data/ext/grhfilrun/src/problem.c +415 -0
  31. data/ext/grhfilrun/src/problem.h +179 -0
  32. data/ext/grhfilrun/src/queue.c +533 -0
  33. data/ext/grhfilrun/src/queue.h +182 -0
  34. data/ext/grhfilrun/src/sample.c +19 -0
  35. data/ext/grhfilrun/src/sspc.c +597 -0
  36. data/ext/grhfilrun/src/sspc2.c +491 -0
  37. data/ext/grhfilrun/src/stdlib2.c +1482 -0
  38. data/ext/grhfilrun/src/stdlib2.h +892 -0
  39. data/ext/grhfilrun/src/trsact.c +817 -0
  40. data/ext/grhfilrun/src/trsact.h +160 -0
  41. data/ext/grhfilrun/src/vec.c +745 -0
  42. data/ext/grhfilrun/src/vec.h +172 -0
  43. data/ext/lcmrun/extconf.rb +20 -0
  44. data/ext/lcmrun/lcmrun.cpp +99 -0
  45. data/ext/lcmrun/src/aheap.c +216 -0
  46. data/ext/lcmrun/src/aheap.h +111 -0
  47. data/ext/lcmrun/src/base.c +92 -0
  48. data/ext/lcmrun/src/base.h +59 -0
  49. data/ext/lcmrun/src/itemset.c +496 -0
  50. data/ext/lcmrun/src/itemset.h +157 -0
  51. data/ext/lcmrun/src/lcm.c +427 -0
  52. data/ext/lcmrun/src/problem.c +349 -0
  53. data/ext/lcmrun/src/problem.h +177 -0
  54. data/ext/lcmrun/src/queue.c +528 -0
  55. data/ext/lcmrun/src/queue.h +176 -0
  56. data/ext/lcmrun/src/sgraph.c +359 -0
  57. data/ext/lcmrun/src/sgraph.h +173 -0
  58. data/ext/lcmrun/src/stdlib2.c +1282 -0
  59. data/ext/lcmrun/src/stdlib2.h +823 -0
  60. data/ext/lcmrun/src/trsact.c +747 -0
  61. data/ext/lcmrun/src/trsact.h +159 -0
  62. data/ext/lcmrun/src/vec.c +731 -0
  63. data/ext/lcmrun/src/vec.h +171 -0
  64. data/ext/lcmseq0run/extconf.rb +20 -0
  65. data/ext/lcmseq0run/lcmseq0run.cpp +59 -0
  66. data/ext/lcmseq0run/src/aheap.c +216 -0
  67. data/ext/lcmseq0run/src/aheap.h +111 -0
  68. data/ext/lcmseq0run/src/base.c +92 -0
  69. data/ext/lcmseq0run/src/base.h +59 -0
  70. data/ext/lcmseq0run/src/itemset.c +518 -0
  71. data/ext/lcmseq0run/src/itemset.h +157 -0
  72. data/ext/lcmseq0run/src/itemset_zero.c +522 -0
  73. data/ext/lcmseq0run/src/lcm_seq.c +446 -0
  74. data/ext/lcmseq0run/src/lcm_seq_zero.c +446 -0
  75. data/ext/lcmseq0run/src/problem.c +439 -0
  76. data/ext/lcmseq0run/src/problem.h +179 -0
  77. data/ext/lcmseq0run/src/problem_zero.c +439 -0
  78. data/ext/lcmseq0run/src/queue.c +533 -0
  79. data/ext/lcmseq0run/src/queue.h +182 -0
  80. data/ext/lcmseq0run/src/stdlib2.c +1350 -0
  81. data/ext/lcmseq0run/src/stdlib2.h +864 -0
  82. data/ext/lcmseq0run/src/trsact.c +747 -0
  83. data/ext/lcmseq0run/src/trsact.h +159 -0
  84. data/ext/lcmseq0run/src/vec.c +779 -0
  85. data/ext/lcmseq0run/src/vec.h +172 -0
  86. data/ext/lcmseqrun/extconf.rb +20 -0
  87. data/ext/lcmseqrun/lcmseqrun.cpp +101 -0
  88. data/ext/lcmseqrun/src/aheap.c +216 -0
  89. data/ext/lcmseqrun/src/aheap.h +111 -0
  90. data/ext/lcmseqrun/src/base.c +92 -0
  91. data/ext/lcmseqrun/src/base.h +59 -0
  92. data/ext/lcmseqrun/src/itemset.c +518 -0
  93. data/ext/lcmseqrun/src/itemset.h +157 -0
  94. data/ext/lcmseqrun/src/itemset_zero.c +522 -0
  95. data/ext/lcmseqrun/src/lcm_seq.c +447 -0
  96. data/ext/lcmseqrun/src/lcm_seq_zero.c +446 -0
  97. data/ext/lcmseqrun/src/problem.c +439 -0
  98. data/ext/lcmseqrun/src/problem.h +179 -0
  99. data/ext/lcmseqrun/src/problem_zero.c +439 -0
  100. data/ext/lcmseqrun/src/queue.c +533 -0
  101. data/ext/lcmseqrun/src/queue.h +182 -0
  102. data/ext/lcmseqrun/src/stdlib2.c +1350 -0
  103. data/ext/lcmseqrun/src/stdlib2.h +864 -0
  104. data/ext/lcmseqrun/src/trsact.c +747 -0
  105. data/ext/lcmseqrun/src/trsact.h +159 -0
  106. data/ext/lcmseqrun/src/vec.c +779 -0
  107. data/ext/lcmseqrun/src/vec.h +172 -0
  108. data/ext/lcmtransrun/extconf.rb +18 -0
  109. data/ext/lcmtransrun/lcmtransrun.cpp +264 -0
  110. data/ext/macerun/extconf.rb +20 -0
  111. data/ext/macerun/macerun.cpp +57 -0
  112. data/ext/macerun/src/aheap.c +217 -0
  113. data/ext/macerun/src/aheap.h +112 -0
  114. data/ext/macerun/src/itemset.c +491 -0
  115. data/ext/macerun/src/itemset.h +158 -0
  116. data/ext/macerun/src/mace.c +503 -0
  117. data/ext/macerun/src/problem.c +346 -0
  118. data/ext/macerun/src/problem.h +174 -0
  119. data/ext/macerun/src/queue.c +529 -0
  120. data/ext/macerun/src/queue.h +177 -0
  121. data/ext/macerun/src/sgraph.c +360 -0
  122. data/ext/macerun/src/sgraph.h +174 -0
  123. data/ext/macerun/src/stdlib2.c +993 -0
  124. data/ext/macerun/src/stdlib2.h +811 -0
  125. data/ext/macerun/src/vec.c +634 -0
  126. data/ext/macerun/src/vec.h +170 -0
  127. data/ext/sspcrun/extconf.rb +20 -0
  128. data/ext/sspcrun/src/_sspc.c +358 -0
  129. data/ext/sspcrun/src/aheap.c +545 -0
  130. data/ext/sspcrun/src/aheap.h +251 -0
  131. data/ext/sspcrun/src/base.c +92 -0
  132. data/ext/sspcrun/src/base.h +59 -0
  133. data/ext/sspcrun/src/fstar.c +496 -0
  134. data/ext/sspcrun/src/fstar.h +80 -0
  135. data/ext/sspcrun/src/grhfil.c +213 -0
  136. data/ext/sspcrun/src/itemset.c +713 -0
  137. data/ext/sspcrun/src/itemset.h +170 -0
  138. data/ext/sspcrun/src/problem.c +415 -0
  139. data/ext/sspcrun/src/problem.h +179 -0
  140. data/ext/sspcrun/src/queue.c +533 -0
  141. data/ext/sspcrun/src/queue.h +182 -0
  142. data/ext/sspcrun/src/sample.c +19 -0
  143. data/ext/sspcrun/src/sspc.c +598 -0
  144. data/ext/sspcrun/src/sspc2.c +491 -0
  145. data/ext/sspcrun/src/stdlib2.c +1482 -0
  146. data/ext/sspcrun/src/stdlib2.h +892 -0
  147. data/ext/sspcrun/src/trsact.c +817 -0
  148. data/ext/sspcrun/src/trsact.h +160 -0
  149. data/ext/sspcrun/src/vec.c +745 -0
  150. data/ext/sspcrun/src/vec.h +172 -0
  151. data/ext/sspcrun/sspcrun.cpp +54 -0
  152. data/lib/nysol/enumLcmEp.rb +338 -0
  153. data/lib/nysol/enumLcmEsp.rb +284 -0
  154. data/lib/nysol/enumLcmIs.rb +275 -0
  155. data/lib/nysol/enumLcmSeq.rb +143 -0
  156. data/lib/nysol/items.rb +201 -0
  157. data/lib/nysol/seqDB.rb +256 -0
  158. data/lib/nysol/take.rb +39 -0
  159. data/lib/nysol/taxonomy.rb +113 -0
  160. data/lib/nysol/traDB.rb +257 -0
  161. metadata +239 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e30036a31f3107df33aae6da18928c97c03ce52d
4
+ data.tar.gz: b2bc758258baffa71e8a76c75299e24458357d44
5
+ SHA512:
6
+ metadata.gz: e1d5c04b64285de5052506231838b388a83e5258b9d015e28beece15c7129e044aefc910ffe80ec9b09c98462077e331aa36ac9dcd437c1b86e7ecf21fbda861
7
+ data.tar.gz: 3bb9949747aa25c85c272347bf3d84ab1d25f03b8410ba5417d97e9e288e7eb3d35eabc550ece20182e6e3dd9e51e81286d9c55b01751b12cb90c74a18d1801d
data/bin/mbiclique.rb ADDED
@@ -0,0 +1,317 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+ require "nysol/take"
7
+ require "nysol/enumLcmIs"
8
+
9
+ # ver="1.0" # 初期リリース 2014/8/2
10
+ # ver="1.1" # アイテムの数値ソートに関するバグ修正 2015/9/8
11
+ # ver="1.2" # null値が含まれる場合にmappingテーブルがずれるバグ修正 2015/10/1
12
+ $cmd=File.basename($0)
13
+ $version="1.2"
14
+
15
+ def help
16
+
17
+ STDERR.puts <<EOF
18
+ ----------------------------
19
+ mbiclique.rb version #{$version}
20
+ ----------------------------
21
+ 概要) lcmによる極大二部クリークの列挙
22
+ 内容) 二部グラフデータを入力として、極大二部クリークを列挙する。
23
+ 書式) mbiclique.rb ei= [ef=] [o=] [l=] [u=] [o=] [-edge] [T=] [-debug] [--help]
24
+
25
+ ファイル名指定
26
+ ei= : 辺データファイル
27
+ ef= : 辺データ上の2つの部項目名(省略時は"node1,node2")
28
+ o= : 出力ファイル
29
+ l= : 二部クリークを構成する最小節点数(ここで指定したサイズより小さいクリークは列挙されない)
30
+ : カンマで区切って2つの値を指定すると、各部のサイズを制限できる
31
+ : 1つ目の値はef=で指定した1つ目の部に対応し、2つ目の値は2つ目に指定した部に対応する。
32
+ u= : クリークを構成する最大節点数(ここで指定したサイズより大きいクリークは列挙されない)
33
+ : カンマで区切って2つの値を指定すると、各部のサイズを制限できる
34
+ -edge : 枝による出力(クリークIDと枝(節点ペア)で出力する)
35
+
36
+ その他
37
+ T= : ワークディレクトリ(default:/tmp)
38
+ --help : ヘルプの表示
39
+
40
+ 入力形式)
41
+ 二部グラフの節点ペアを項目で表現したCSVデータ。
42
+
43
+ 出力形式1)
44
+ 二部クリークを構成する全節点を各部ごとにベクトル形式で出力する。
45
+ 出力項目は、"節点項目名1,節点項目名2,size1,size2"の4項目で、節点名1と節点名2は、ef=で指定された名称が利用される。
46
+ 節点項目名1,節点項目名2に出力される値が節点名ベクトルである(一行が一つの二部クリークに対応)ことが異なる。
47
+ idはクリークの識別番号で、一つのクリークは同じid番号が振られる。id番号そのものに意味はない。
48
+ 節点項目名1,節点項目名2には、各部を構成する節点名のベクトルが出力される。
49
+ size1,size2は二部クリークを構成する各部の節点数である。
50
+
51
+ 出力形式2) -edge を指定した場合の出力形式
52
+ クリークIDと二部クリークを構成する全枝(節点ペア)を出力する。
53
+ 出力項目は"id,節点項目名1,節点項目名2,size"の4項目である。
54
+ 例えば各部のサイズが3,4であるような二部クリークは12行の枝データとして出力される。
55
+ 出力形式1に比べてファイルサイズは大きくなる。
56
+
57
+
58
+ 例1)
59
+ $ cat data1.csv
60
+ node1,node2
61
+ a,A
62
+ a,B
63
+ a,C
64
+ b,A
65
+ b,B
66
+ b,D
67
+ c,A
68
+ c,D
69
+ d,B
70
+ d,C
71
+ d,D
72
+
73
+ $ mclique.rb ei=data1.csv ef=n1,n2 o=out1.csv
74
+ #MSG# converting paired form into transaction form ...; 2014/03/24 11:52:05
75
+ #MSG# lcm_20140215 CIf /tmp/__MTEMP_47150_70177387663280_0 1 /tmp/__MTEMP_47150_70177387663280_3; 2014/03/24 11:52:05
76
+ trsact: /tmp/__MTEMP_47150_70177387663280_0 ,#transactions 4 ,#items 4 ,size 11 extracted database: #transactions 4 ,#items 4 ,size 11
77
+ output to: /tmp/__MTEMP_47150_70177387663280_3
78
+ separated at 0
79
+ 11
80
+ 1
81
+ 3
82
+ 4
83
+ 3
84
+ iters=11
85
+ #END# mbiclique.rb ei=data1.csv o=out1.csv ef=node1,node2
86
+ $ cat out1.csv
87
+ node1,node2,size1,size2
88
+ a,A B C,1,3
89
+ a b,A B,2,2
90
+ a b c,A,3,1
91
+ a b d,B,3,1
92
+ a d,B C,2,2
93
+ b,A B D,1,3
94
+ b c,A D,2,2
95
+ b c d,D,3,1
96
+ b d,B D,2,2
97
+ d,B C D,1,3
98
+
99
+ 例3) 枝による出力(-edgeの指定)
100
+ $ mclique.rb ei=data1.csv ef=n1,n2 o=out2.csv
101
+ #END# ../../bin/mbiclique.rb ei=data/data1.csv o=xxresult/out11.csv ef=node1,node2 -edge
102
+ $ cat out2.csv
103
+ id,node1,node2,size1,size2
104
+ 1,c,A,3,1
105
+ 1,a,A,3,1
106
+ 1,b,A,3,1
107
+ 10,d,B,1,3
108
+ 10,d,C,1,3
109
+ 10,d,D,1,3
110
+ 2,b,B,3,1
111
+ 2,a,B,3,1
112
+ 2,d,B,3,1
113
+ :
114
+
115
+ 例3) 部node1の最小サイズを3に制限
116
+ $ mbiclique.rb ei=data1.csv o=out3.csv ef=node1,node2 l=3,
117
+ #END# mbiclique.rb ei=data1.csv o=out3.csv ef=node1,node2 l=3,
118
+ $ cat out3.csv
119
+ node1,node2,size1,size2
120
+ a b c,A,3,1
121
+ a b d,B,3,1
122
+ b c d,D,3,1
123
+
124
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
125
+ EOF
126
+ exit
127
+ end
128
+ def ver()
129
+ STDERR.puts "version #{$version}"
130
+ exit
131
+ end
132
+
133
+ help() if ARGV.size <= 0 or ARGV[0]=="--help"
134
+ ver() if ARGV[0]=="--version"
135
+ args=MCMD::Margs.new(ARGV,"ei=,ef=,o=,l=,u=,-edge","ei=")
136
+
137
+ # コマンド実行可能確認
138
+ #exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD , "executable"))
139
+
140
+ # コマンド実行可能確認
141
+ #exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD, "executable"))
142
+ #exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD_TRANS, "-v", "lcm_trans 1.0"))
143
+
144
+ # mcmdのメッセージは警告とエラーのみ
145
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
146
+
147
+ #ワークファイルパス
148
+ if args.str("T=")!=nil then
149
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
150
+ end
151
+
152
+ type="C"
153
+
154
+ byedge = args.bool("-edge")
155
+ oFile = args.file("o=", "w")
156
+ ei = args. file("ei=","r") # edgeファイル名
157
+ ef1,ef2 = args.field("ef=", ei, "node1,node2",2,2)["names"]
158
+
159
+ minSizeStr = args.str("l=") # クリークサイズ下限
160
+ maxSizeStr = args.str("u=") # クリークサイズ上限
161
+ minSize1=nil
162
+ minSize2=nil
163
+ if minSizeStr then
164
+ minSizeStr=minSizeStr.split(",",-1)
165
+ if minSizeStr.size==1 then
166
+ minSize1=minSizeStr[0].to_i if minSizeStr[0]!=""
167
+ minSize2=minSizeStr[0].to_i if minSizeStr[0]!=""
168
+ else
169
+ minSize1=minSizeStr[0].to_i if minSizeStr[0]!=""
170
+ minSize2=minSizeStr[1].to_i if minSizeStr[1]!=""
171
+ end
172
+ end
173
+ if maxSizeStr then
174
+ maxSizeStr=maxSizeStr.split(",",-1)
175
+ if maxSizeStr.size==1 then
176
+ maxSize1=maxSizeStr[0].to_i if maxSizeStr[0]!=""
177
+ maxSize2=maxSizeStr[0].to_i if maxSizeStr[0]!=""
178
+ else
179
+ maxSize1=maxSizeStr[0].to_i if maxSizeStr[0]!=""
180
+ maxSize2=maxSizeStr[1].to_i if maxSizeStr[1]!=""
181
+ end
182
+ end
183
+
184
+ def pair2tra(ei,ef1,ef2,traFile,mapFile1,mapFile2)
185
+ MCMD::msgLog("converting paired form into transaction form ...")
186
+ wf=MCMD::Mtemp.new
187
+ wf1=wf.file
188
+ wf2=wf.file
189
+
190
+ f=""
191
+ f << "mcut f=#{ef1}:node1 i=#{ei} |"
192
+ f << "mdelnull f=node1 |"
193
+ f << "msortf f=node1 |"
194
+ f << "muniq k=node1 |"
195
+ f << "mnumber s=node1 a=num1 o=#{mapFile1}"
196
+ system(f)
197
+
198
+ f=""
199
+ f << "mcut f=#{ef2}:node2 i=#{ei} |"
200
+ f << "mdelnull f=node2 |"
201
+ f << "msortf f=node2 |"
202
+ f << "muniq k=node2 |"
203
+ f << "mnumber s=node2 a=num2 o=#{mapFile2}"
204
+ system(f)
205
+
206
+ f=""
207
+ f << "mcut f=#{ef1}:node1,#{ef2}:node2 i=#{ei} |"
208
+ f << "msortf f=node1 |"
209
+ f << "mjoin k=node1 m=#{mapFile1} f=num1 |"
210
+ f << "msortf f=node2 |"
211
+ f << "mjoin k=node2 m=#{mapFile2} f=num2 |"
212
+ f << "mcut f=num1,num2 |"
213
+ f << "msortf f=num1,num2%n |"
214
+ f << "mtra k=num1 s=num2%n f=num2 |"
215
+ f << "msortf f=num1%n |"
216
+ f << "mcut f=num2 -nfno o=#{traFile}"
217
+ system(f)
218
+ end
219
+
220
+
221
+ wf=MCMD::Mtemp.new
222
+ xxtra=wf.file
223
+ xxmap1=wf.file
224
+ xxmap2=wf.file
225
+ pair2tra(ei,ef1,ef2,xxtra,xxmap1,xxmap2)
226
+ #system "cp #{xxtra} xxtra"
227
+ #system "cp #{xxmap1} xxmap1"
228
+ #system "cp #{xxmap2} xxmap2"
229
+
230
+ # 利用コマンドファイル名
231
+ #CMD="lcm_20140215"
232
+ #{TAKE::LcmIs::CMD}
233
+
234
+ run=""
235
+ run << "#{type}If"
236
+ run << " -l #{minSize2}" if minSize2 # パターンサイズ下限
237
+ run << " -u #{maxSize2}" if maxSize2 # パターンサイズ上限
238
+
239
+ # lcm出力ファイル
240
+ lcmout = wf.file
241
+ # 頻出パターンがなかった場合、lcm出力ファイルが生成されないので
242
+ # そのときのために空ファイルを生成しておいく。
243
+ system("touch #{lcmout}")
244
+
245
+ # lcm実行
246
+ minCnt=1
247
+ MCMD::msgLog("#{run} #{xxtra} #{minCnt} #{lcmout}")
248
+ TAKE::run_lcm("#{run} #{xxtra} #{minCnt} #{lcmout}")
249
+ #system("#{run} #{xxtra} #{minCnt} #{lcmout}")
250
+ #system "cp #{lcmout} lcmout"
251
+
252
+ xxp0=wf.file
253
+ xxt0=wf.file
254
+
255
+ TAKE::run_lcmtrans(lcmout,"p",xxt0)
256
+
257
+ f=""
258
+ #f << "#{TAKE::LcmIs::CMD_TRANS} #{lcmout} p |" # pattern,count,size,pid
259
+ f << "mdelnull f=pattern i=#{xxt0} |"
260
+ f << "mvreplace vf=pattern m=#{xxmap2} K=num2 f=node2 |"
261
+ f << "mcut f=pid,pattern,size:size2 |"
262
+ f << "mvsort vf=pattern |"
263
+ f << "msortf f=pid o=#{xxp0}"
264
+ system(f)
265
+ #system "cp #{xxp0} xxp0"
266
+
267
+ if byedge then
268
+ xx1=wf.file
269
+ xx2=wf.file
270
+ xx3=wf.file
271
+
272
+ system "mtra f=pattern i=#{xxp0} -r o=#{xx1}"
273
+
274
+ xx3t=wf.file
275
+ TAKE::run_lcmtrans(lcmout,"t",xx3t)
276
+
277
+ f=""
278
+ #f << "#{TAKE::LcmIs::CMD_TRANS} #{lcmout} t |" #__tid,pid
279
+ #f << "mcal c='${__tid}+1' a=_tid |"
280
+ f << "msortf f=__tid i=#{xx3t} |"
281
+ f << "mjoin k=__tid m=#{xxmap1} f=node1 K=num1 |"
282
+ f << "msortf f=pid o=#{xx2}"
283
+ system(f)
284
+
285
+ f=""
286
+ f << "mcount k=pid a=size1 i=#{xx2} |"
287
+ f << "mselnum f=size1 c='[#{minSize1},#{maxSize1}]' o=#{xx3}"
288
+ system(f)
289
+
290
+ f = ""
291
+ f << "mjoin k=pid m=#{xx3} f=size1 i=#{xx2} |"
292
+ f << "mnjoin k=pid m=#{xx1} f=pattern,size2 |"
293
+ f << "mcut f=pid:id,node1:#{ef1},pattern:#{ef2},size1,size2 o=#{oFile}"
294
+ system(f)
295
+ else
296
+
297
+ xx4t=wf.file
298
+ TAKE::run_lcmtrans(lcmout,"t",xx4t)
299
+
300
+ f=""
301
+ #f << "#{TAKE::LcmIs::CMD_TRANS} #{lcmout} t |" #__tid,pid
302
+ #f << "mcal c='${__tid}+1' a=_tid |"
303
+ f << "msortf f=__tid i=#{xx4t} |"
304
+ f << "mjoin k=__tid m=#{xxmap1} f=node1 K=num1 |"
305
+ f << "msortf f=pid |"
306
+ f << "mtra k=pid f=node1 |"
307
+ f << "mvcount vf=node1:size1 |"
308
+ f << "mjoin k=pid m=#{xxp0} f=pattern,size2 |"
309
+ f << "mselnum f=size1 c='[#{minSize1},#{maxSize1}]' |"
310
+ f << "mvsort vf=node1,pattern |"
311
+ f << "msortf f=node1,pattern |"
312
+ f << "mcut f=node1:#{ef1},pattern:#{ef2},size1,size2 o=#{oFile}"
313
+ system(f)
314
+ end
315
+ # 終了メッセージ
316
+ MCMD::endLog(args.cmdline)
317
+
data/bin/mbipolish.rb ADDED
@@ -0,0 +1,362 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+ require "nysol/take"
7
+ require "set"
8
+
9
+ # ver="1.0" # 初期リリース 2015/09/27
10
+ # ver="1.1" # 2つ目の類似度と閾値の追加 2015/11/22
11
+ # ver="1.2" # logファイル出力追加 2016/06/25
12
+ # ver="1.3" # kn=を追加 2016/08/24
13
+ # ver="1.4" # kn2=を追加 2016/09/10
14
+ $cmd=$0.sub(/.*\//,"")
15
+ $version="1.4"
16
+
17
+ def help
18
+ STDERR.puts <<EOF
19
+ ----------------------------
20
+ #{$cmd} version #{$version}
21
+ ----------------------------
22
+ 概要) 2部グラフの研磨をおこなう。
23
+ 内容) 2部グラフを入力として、密度の高い2部部分グラフにあって枝が張られていないノードペアに枝を張る。
24
+ 逆に、密度の低い2部部分グラフにあって枝が張られているノードペアの枝を刈る。
25
+ 新たに張られる枝や刈られる枝の程度は、sim=,th=とsim2,th2で与えた値によって変わる。
26
+ 書式) #{$cmd} ei= [ef=] [nf=] eo= [sim=i|I|s|S|T|R|P|C] th= [th2=] [sim2=i|I|s|S|T|R|P|C] [sup=] [iter=] [log=] [T=] [--help]
27
+
28
+ ファイル名指定
29
+ ei= : 枝データファイル
30
+ ef= : 枝データ上の2つの節点項目名(省略時は"node1,node2")
31
+ eo= : データ研磨後の枝データファイル
32
+ sim|2= : 節点a,bと接続された枝集合を、それぞれA,Bとすると、節点a,bに枝を張るために用いる類似度。
33
+ 省略時はRが設定される。(sim2のデフォルト:sim=)
34
+ i: inclusion
35
+ I: both-inclusion
36
+ S: |A∩B|/max(|A|,|B|)
37
+ s: |A∩B|/min(|A|,|B|)
38
+ T (intersection): find pairs having common [threshld] items
39
+ R (resemblance): find pairs s.t. |A\capB|/|A\cupB| >= [threshld]
40
+ P (PMI): find pairs s.t. log (|A\capB|*|all| / (|A|*|B|)) >= [threshld]
41
+ C (cosine distance): find pairs s.t. inner product of their normalized vectors >= [threshld]
42
+ th|2= : sim|2=で指定された類似度について、ここで指定された値以上の節点間に枝を張る。(th2のデフォルト:th=)
43
+ sup= : 左の部の次数がsup以上のノードを対象とする。省略すればsup=0。
44
+ kn|2 = : kn=で指定された値以上の共起頻度を対象とする。kn2=で指定された値以上の次数を持つ右部を対象とする。
45
+ 省略すればkn=1,kn2=1 [1以上の整数]
46
+ iter= : データ研磨の最大繰り返し数(デフォルト=30)
47
+ log= : ディレクトリ内にパラメータの設定値や収束回数等をkey-value形式のCSVで出力.繰り返し毎に生成される類似グループ出力
48
+
49
+
50
+ その他
51
+ T= : ワークディレクトリ(default:/tmp)
52
+ --help : ヘルプの表示
53
+
54
+ 備考)
55
+ 内部で起動しているコマンドsspcは0から始まる整数で指定された節点名を前提として処理する。
56
+ 一方で本コマンドは、任意の文字列で節点名を表したデータを処理できる。
57
+ それは、sspcを実行する前に、それら文字列と整数との対応表を前処理で作成しているからである。
58
+
59
+ 例) 2部グラフデータからのみグラフ研磨を実行する例
60
+ $ cat edge.csv
61
+ node1,node2
62
+ A,a
63
+ A,b
64
+ B,a
65
+ B,b
66
+ C,c
67
+ C,d
68
+ D,b
69
+ D,e
70
+
71
+ $ #{$cmd} ei=edge.csv ef=n1,n2 th=0.2 eo=output.csv
72
+ #MSG# converting the numbered nodes into original name ...; 2015/09/27 21:59:08
73
+ #END# #{$cmd} ei=edge.csv ef=n1,n2 th=0.2 eo=output.csv; 2015/09/27 21:59:08
74
+ $ cat output.csv
75
+ n1,n2
76
+ A,a
77
+ A,b
78
+ A,e
79
+ B,a
80
+ B,b
81
+ B,e
82
+ C,c
83
+ C,d
84
+ D,a
85
+ D,b
86
+ D,e
87
+
88
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
89
+ EOF
90
+ exit
91
+ end
92
+
93
+ def ver()
94
+ STDERR.puts "version #{$version}"
95
+ exit
96
+ end
97
+
98
+ help() if ARGV.size <= 0 or ARGV[0]=="--help"
99
+ ver() if ARGV[0]=="--version"
100
+
101
+ args=MCMD::Margs.new(ARGV,"ei=,ef=,eo=,th=,sim=,th2=,sim2=,kn=,kn2=,sup=,iter=,log=","ei=,ef=,th=")
102
+
103
+ # コマンド実行可能確認
104
+ #CMD_sspc="sspc_20161209"
105
+ #CMD_grhfil="grhfil_20150920"
106
+ #exit(1) unless(MCMD::chkCmdExe(CMD_sspc , "executable"))
107
+ #exit(1) unless(MCMD::chkCmdExe(CMD_grhfil, "executable"))
108
+
109
+ # mcmdのメッセージは警告とエラーのみ
110
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
111
+
112
+ #ワークファイルパス
113
+ if args.str("T=")!=nil then
114
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
115
+ end
116
+
117
+
118
+ ei = args. file("ei=","r") # edge file name
119
+
120
+ # ---- edge field names (two nodes) on ei=
121
+ $ef1,$ef2 = args.field("ef=", ei, "node1,node2",2,2)["names"]
122
+
123
+ measure = args.str("sim=","R") # similarity measure
124
+ measure2 = args.str("sim2=",measure) # similarity measure
125
+ minSupp = args.int("sup=",0) # minimam support
126
+ iterMax = args.int("iter=",30,1) # upper bound of iterations
127
+ th = args.float("th=") # threashold for similarity measure
128
+ th2 = args.float("th2=",th) # threashold for similarity measure
129
+ kn = args.float("kn=",1) # no. of interaction size more than threshold
130
+ kn2 = args.float("kn2=",1) # no. of right node size more than threshold
131
+
132
+ eo = args.file("eo=", "w")
133
+ logDir = args.file("log=", "w")
134
+ outDir = args.str("O=") # 過程出力
135
+ MCMD::mkDir(outDir) if outDir
136
+ MCMD::mkDir(logDir) if logDir
137
+
138
+ # node数とedge数をカウント
139
+ def calGsize(file)
140
+ nodes=Set.new
141
+ edgeSize=0
142
+ File.open(file,"r"){|fpr|
143
+ while line = fpr.gets
144
+ n1,n2 = line.split(" ")
145
+ nodes << n1
146
+ nodes << n2
147
+ edgeSize+=1
148
+ end
149
+ }
150
+ return nodes.size,edgeSize
151
+ end
152
+
153
+ def same?(file1,file2)
154
+ xx=MCMD::Mtemp.new.file
155
+
156
+ return false if File.size(file1)!=File.size(file2)
157
+ system "diff -q #{file1} #{file2} > #{xx}"
158
+ return false if File.size(xx)!=0
159
+ return true
160
+ end
161
+
162
+ def edge2mtx(ei,itra)
163
+ MCMD::msgLog("converting graph files into a pair of numbered nodes ...")
164
+ wf=MCMD::Mtemp.new
165
+ wf1=wf.file
166
+ wf2=wf.file
167
+ wf3=wf.file
168
+
169
+
170
+ system "mcut f=#{$ef1}:node i=#{ei} o=#{wf1}"
171
+ system "mcut f=#{$ef2}:node i=#{ei} o=#{wf2}"
172
+
173
+ # 各部ごとにマッピングテーブルを用意
174
+ system "mcut f=#{$ef1} i=#{ei} |muniq k=#{$ef1} |mdelnull f=#{$ef1} |mnumber -q a=num1 S=1 o=#{PART1}"
175
+ system "mcut f=#{$ef2} i=#{ei} |muniq k=#{$ef2} |mdelnull f=#{$ef2} |mnumber -q a=num2 S=1 o=#{PART2}"
176
+
177
+ f=""
178
+ f << "mcut f=#{$ef1},#{$ef2} i=#{ei} |"
179
+ f << "msortf f=#{$ef1} |"
180
+ f << "mjoin k=#{$ef1} m=#{PART1} f=num1 |"
181
+ f << "msortf f=#{$ef2} |"
182
+ f << "mjoin k=#{$ef2} m=#{PART2} f=num2 |"
183
+ f << "mcut f=num1,num2 |"
184
+ f << "mtra k=num1 f=num2 |"
185
+ f << "msortf f=num1%n |"
186
+ f << "mcut f=num2 -nfno |"
187
+ f << "tr ',' ' ' >#{itra}"
188
+ system(f)
189
+
190
+ end
191
+
192
+ def noPat
193
+ MCMD::msgLog("There is no frequent item. The value is too large")
194
+ exit
195
+ end
196
+
197
+ def convRsl(ifile,ofile,logDir=nil)
198
+
199
+ # 上記iterationで収束したマイクロクラスタグラフを元の節点文字列に直して出力する
200
+ MCMD::msgLog("converting the numbered nodes into original name ...")
201
+ f=""
202
+ f << "mcut -nfni f=0:tra <#{ifile} |"
203
+ f << "msed f=tra c=' $' v="" |"
204
+ f << "mnumber -q S=1 a=num1 |"
205
+ f << "mtra -r f=tra:num2 |"
206
+ f << "mjoin k=num2 m=#{PART2} f=#{$ef2} |"
207
+ f << "mjoin k=num1 m=#{PART1} f=#{$ef1} |"
208
+ f << "msortf f=num1%n,num2%n |"
209
+ f << "mcut f=#{$ef1},#{$ef2} |"
210
+ if logDir
211
+ f << "mfldname -q o=#{logDir}/#{ofile}"
212
+ else
213
+ f << "mfldname -q o=#{ofile}"
214
+ end
215
+ system(f)
216
+
217
+ end
218
+
219
+ def convSim(ifile,ofile,logDir)
220
+
221
+ f=""
222
+ f << "mcut -nfni f=0:tra <#{ifile} |"
223
+ f << "msed f=tra c=' $' v="" |"
224
+ f << "mnumber -q S=1 a=num0 |"
225
+ f << "mtra -r f=tra:num11 |"
226
+ f << "mnumber -q S=1 a=order |"
227
+ f << "mcal c='${num11}+1' a=num1 |"
228
+ f << "mjoin k=num1 m=#{PART1} f=#{$ef1} |"
229
+ f << "msortf f=order%n,num1%n |"
230
+ f << "mtra k=num0 s=order f=#{$ef1} |"
231
+ f << "mcut f=#{$ef1} o=#{logDir}/#{ofile}"
232
+ system(f)
233
+
234
+ end
235
+
236
+ # ============
237
+ # entry point
238
+ t=Time.now
239
+
240
+ # 入力ファイルをノード番号ペアデータ(input)に変換する。
241
+ # csvで指定された場合は、番号-アイテムmapデータも作成
242
+ wf=MCMD::Mtemp.new
243
+ xxinp=wf.file
244
+ PART1=wf.file # 数値と文字のマッピング用1
245
+ PART2=wf.file # 数値と文字のマッピング用1
246
+
247
+ edge2mtx(ei,xxinp)
248
+ input=xxinp
249
+
250
+ xxpair = wf.file # pair形式
251
+ xxtra = wf.file # tra形式
252
+ xxitra = wf.file # 処理入力のtra形式
253
+ xxdiff = wf.file # 差分ファイル
254
+ xxprev = wf.file # 前回のxxtra
255
+ xxsimgp= wf.file # 類似度グループの保存
256
+
257
+ nSizes=[]
258
+ eSizes=[]
259
+ denses=[]
260
+
261
+ #system "#{CMD_grhfil} D"" #{input} #{xxitra}"
262
+ TAKE::run_grhfil("D"" #{input} #{xxitra}")
263
+ puts "grhfil D"" #{input} #{xxitra}"
264
+
265
+
266
+ iter=0
267
+ while true
268
+
269
+ # 終了判定
270
+ break if iter>=iterMax
271
+ break if iter!=0 and same?(xxitra,xxprev)
272
+
273
+ MCMD::msgLog("polishing iteration ##{iter} (tra size=#{File.size(xxitra)}")
274
+ system "cp #{xxitra} #{xxprev}"
275
+
276
+ nodeSize,edgeSize=calGsize(xxitra)
277
+ edgeSize1 = edgeSize+1
278
+
279
+ #system "#{CMD_sspc} t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}"
280
+ TAKE::run_sspc("t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}")
281
+ puts "sspc t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}"
282
+
283
+ # 閾値が大きくてパターンが抽出されない場合は終了
284
+ noPat unless File.exist?("#{xxpair}")
285
+ noPat if File.size("#{xxpair}") == 0
286
+
287
+ # node pairをsspc入力形式に変換
288
+ # ./grhfil/grhfil eu0_ _TMP2_ _TMP3_
289
+ #system "#{CMD_grhfil} eu0 #{xxpair} #{xxtra}"
290
+ TAKE::run_grhfil("eu0 #{xxpair} #{xxtra}")
291
+ puts "grhfil eu0 #{xxpair} #{xxtra}"
292
+
293
+ convSim("#{xxtra}","simGp#{iter}.csv",logDir) if logDir
294
+
295
+ # 入力と類似行列を連結
296
+ system "cat #{xxitra} #{xxtra} > #{xxpair}"
297
+
298
+ # 入力ファイルと、比較ファイルを比較 => 新しいトランザクションDBの完成
299
+ #system "#{CMD_sspc} #{measure2} -T #{kn2} -c #{edgeSize} #{xxpair} #{th2} #{xxtra}"
300
+ TAKE::run_sspc("#{measure2} -T #{kn2} -c #{edgeSize} #{xxpair} #{th2} #{xxtra}")
301
+ puts "sspc #{measure2} -T #{kn2} -c #{edgeSize} #{xxpair} #{th2} #{xxtra}"
302
+
303
+
304
+ # 閾値が大きくてパターンが抽出されない場合は終了
305
+ noPat unless File.exist?("#{xxtra}")
306
+ noPat if File.size("#{xxtra}") == 0
307
+
308
+ # 行列形式に変換
309
+ #system "#{CMD_grhfil} ed #{xxtra} #{xxpair}"
310
+ TAKE::run_grhfil("ed #{xxtra} #{xxpair}")
311
+ puts "grhfil ed #{xxtra} #{xxpair}"
312
+
313
+ # catした入力ファイルを削除"
314
+ system "tail -n +#{edgeSize1} #{xxpair} >#{xxtra}"
315
+ #system "#{CMD_grhfil} D #{xxtra} #{xxpair}"
316
+ TAKE::run_grhfil("D #{xxtra} #{xxpair}")
317
+ puts "grhfil D #{xxtra} #{xxpair}"
318
+
319
+ x="$d2/grhfil dE -d _TMP_ _TMP8_ _TMP9_" # 差分計算
320
+ #system "#{CMD_grhfil} dE -d #{xxitra} #{xxpair} #{xxdiff}"
321
+ TAKE::run_grhfil("dE -d #{xxitra} #{xxpair} #{xxdiff}")
322
+ puts "grhfil dE -d #{xxitra} #{xxpair} #{xxdiff}"
323
+
324
+
325
+ system "cp #{xxpair} #{xxitra}"
326
+ if logDir
327
+ #system "#{CMD_grhfil} D #{xxitra} #{xxpair}"
328
+ TAKE::run_grhfil("D #{xxitra} #{xxpair}")
329
+ puts "grhfil D #{xxitra} #{xxpair}"
330
+ convRsl(xxpair,"iter#{iter}.csv",logDir) if logDir
331
+ end
332
+ iter+=1
333
+
334
+ end
335
+
336
+ #system "#{CMD_grhfil} D #{xxitra} #{xxpair}"
337
+ TAKE::run_grhfil("D #{xxitra} #{xxpair}")
338
+ puts "grhfil D #{xxitra} #{xxpair}"
339
+ convRsl("#{xxpair}",eo)
340
+
341
+
342
+ procTime=Time.now-t
343
+
344
+ # ログファイル出力
345
+ if logDir
346
+ kv=args.getKeyValue()
347
+ kv << ["iter",iter]
348
+ kv << ["time",procTime]
349
+ (0...nSizes.size).each{|i|
350
+ kv << ["nSize#{i}",nSizes[i]]
351
+ kv << ["eSize#{i}",eSizes[i]]
352
+ kv << ["dens#{i}" ,denses[i]]
353
+ }
354
+ MCMD::Mcsvout.new("o=#{logDir}/keyVal.csv f=key,value"){|csv|
355
+ kv.each{|line|
356
+ csv.write(line)
357
+ }
358
+ }
359
+ end
360
+
361
+ # 終了メッセージ
362
+ MCMD::endLog(args.cmdline)