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
data/bin/mpal.rb ADDED
@@ -0,0 +1,410 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+
7
+ # 1.0 initial development: 2016/12/23
8
+ # 1.1 dir=x追加: 2016/12/29
9
+ # 1.2 jac=等追加: 2017/1/10
10
+ # 1.3 ro=追加: 2017/1/15
11
+ $version="1.3"
12
+
13
+ def help
14
+
15
+ STDERR.puts <<EOF
16
+ ----------------------------
17
+ #{$cmd} version #{$version}
18
+ ----------------------------
19
+ 概要) トランザクションデータから2アイテム相関ルールを求め、ランクに基づいた類似関係にある相関ルールを選択する
20
+
21
+ 書式) #{$cmd} i= tid= item= [class=] [ro=] [no=] eo= s=|S= [filter=] [lb=] [ub=] [sim=] [rank=] [dir=] [-prune] [T=] [--help]
22
+ i= : トランザクションデータファイル【必須】
23
+ tid= : トランザクションID項目名【必須】
24
+ item= : アイテム項目名【必須】
25
+ ro= : 出力ルールファイル
26
+ no= : 出力ファイル(節点)
27
+ eo= : 出力ファイル(辺:節点ペア)
28
+ s= : 最小支持度(全トランザクション数に対する割合による指定): 0以上1以下の実数
29
+ S= : 最小支持度(トランザクション数による指定): 1以上の整数
30
+ filter=: 相関ルールの評価指標(省略可,複数指定可)
31
+ 指定できる類似度は以下の4つ(括弧内は値域)。
32
+ J: Jaccard(0..1), P:normalized PMI(-1..0..1), C:Confidence(0..1)
33
+ lb= : filter=で指定した相関ルール評価指標の下限値
34
+ ub= : filter=で指定した相関ルール評価指標の上限値
35
+ lb=が省略された場合のデフォルトで0、ub=のデフォルトは1
36
+ 例1: sim=P lb=0.5 : normalized PMIが0.5以上1以下の相関ルールを列挙する
37
+ 例2: sim=P,C lb=0.5,0.2 ub=,0.8 : 例1に加えて、confidenceが0.2以上0.8以下の相関ルールを列挙する
38
+
39
+ sim= : 列挙された相関ルールを元にして枝を張る条件となる指標を指定する。
40
+ 以下に示す4つの相関ルール評価指標が指定できる(デフォルト:S)。
41
+ S:Support, J: Jaccard, P:normalized PMI, C:Confidence
42
+ rank= : 枝を張る条件で、類似枝の上位何個までを選択するか(デフォルト:3)
43
+ dir= : 双方向類似関係(b)のみを出力するか、単方向類似関係(m)のみか、両方とも含める(x)かを指定する。(デフォルト:b)
44
+ 相関ルールa=>bの類似度をsim(a=>b)としたとき、
45
+ b:(bi-directional) sim(a=>b)およびsim(b=>a)がrank=で指定した順位内である相関ルールのみ選択される。
46
+ m:(mono-directional) 片方向の類似度のみが、指定された順位内である相関ルールが選択される。
47
+ x:(both) bとmの両方共含める。
48
+ 以上の3つのパラメータは複数指定することが可能(3つまで)。
49
+ 例1: sim=S dir=b rank=3 :
50
+ アイテムaからみてsupport(a=>b)が3位以内で、かつ
51
+ アイテムbからみてsupport(b=>a)も3位以内であるような相関ルールを選択する
52
+ 例2: sim=S,C dir=b,m rank=3,1
53
+ 例1に加えて、アイテムaから見てconfidenc(a=>b)が3以内、もしくは
54
+ アイテムbから見てconfidenc(b=>a)が3以内であれば、そのような相関ルールも選択する
55
+ -prune : sim=等を複数指定した場合、マルチ枝を単一化する。
56
+ 第1優先順位: 双方向>片方向
57
+ 第2優先順位: パラメータ位置昇順
58
+
59
+ その他
60
+ T= : ワークディレクトリ(default:/tmp)
61
+ --help : ヘルプの表示
62
+
63
+ 入力ファイル形式)
64
+ トランザクションIDとアイテムの2項目によるトランザクションデータ。
65
+
66
+ o=の出力形式)
67
+ 枝ファイル: simType,simPriority,node1,node2,sim,dir,color
68
+ 節点ファイル: node,support,frequency,total
69
+
70
+ 例)
71
+ $ cat tra.csv
72
+ id,item
73
+ 1,a
74
+ 1,b
75
+ 2,a
76
+ 2,b
77
+ 3,a
78
+ 3,b
79
+ 4,b
80
+ 4,c
81
+ 5,a
82
+ 5,c
83
+ 6,a
84
+ 6,c
85
+ 7,d
86
+ 7,e
87
+ 8,d
88
+ 8,e
89
+ 9,d
90
+ 9,e
91
+ A,d
92
+ A,c
93
+ B,e
94
+ B,b
95
+ C,e
96
+ C,a
97
+ D,f
98
+ D,c
99
+ E,f
100
+ E,b
101
+ F,f
102
+ F,a
103
+
104
+ $ #{$cmd} i=tra1.csv no=node11.csv eo=edge11.csv tid=id S=1 item=item sim=S rank=1 dir=b
105
+ $ cat edge11.csv
106
+ simType,simPriority,node1,node2,sim,dir,color
107
+ support,0,a,e,0.2727272727,W,FF0000
108
+ support,0,d,e,0.2727272727,W,FF0000
109
+ support,0,c,f,0.1818181818,W,FF0000
110
+ support,0,g,h,0.1818181818,W,FF0000
111
+
112
+ $ #{$cmd} i=tra2.csv no=node51.csv eo=edge51.csv tid=id S=1 item=item sim=S,C rank=1,1 dir=b,m -prune
113
+ $ cat edge51.csv
114
+ simType,simPriority%3n,node1%0,node2%1,sim,dir%2r,color
115
+ support,0,a,b,0.2,W,FF0000
116
+ confidence,1,c,a,0.4,F,8888FF
117
+ support,0,d,e,0.2,W,FF0000
118
+ confidence,1,f,a,0.3333333333,F,8888FF
119
+ confidence,1,f,b,0.3333333333,F,8888FF
120
+ confidence,1,f,c,0.3333333333,F,8888FF
121
+
122
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
123
+ EOF
124
+ exit
125
+ end
126
+
127
+ def ver()
128
+ STDERR.puts "version #{$version}"
129
+ exit
130
+ end
131
+
132
+ help() if ARGV.size <= 0 or ARGV[0]=="--help"
133
+ ver() if ARGV[0]=="--version"
134
+
135
+ args=MCMD::Margs.new(ARGV,"i=,tid=,item=,ro=,eo=,no=,s=,S=,filter=,lb=,ub=,sim=,dir=,rank=,-prune,-num,-verbose","i=,tid=,item=,eo=,no=")
136
+
137
+ # mcmdのメッセージは警告とエラーのみ
138
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
139
+
140
+ #ワークファイルパス
141
+ if args.str("T=")!=nil then
142
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
143
+ end
144
+ iFile = args.str("i=")
145
+ idFN = args.str("tid=")
146
+ itemFN = args.str("item=")
147
+ sp1 = args.str("s=")
148
+ sp2 = args.str("S=")
149
+ #node_support=args.bool("-node_support")
150
+ numtp = args.bool("-num")
151
+
152
+ filter= args.str("filter=","",",")
153
+ ub = args.str("ub=" ,"",",")
154
+ lb = args.str("lb=" ,"",",")
155
+
156
+ sim = args.str("sim=" ,"S",",")
157
+ dir = args.str("dir=" ,"b",",")
158
+ rank = args.str("rank=","3",",")
159
+ prune = args.bool("-prune")
160
+
161
+ # chicking parameter for filter=
162
+ if filter.size>0
163
+ unless lb
164
+ MCMD::errorLog("lb= have to be set with filter=")
165
+ raise ArgumentError
166
+ end
167
+
168
+ (0...filter.size-1).each{|i|
169
+ (i...filter.size).each{|j|
170
+ next if i==j
171
+ if filter[i]==filter[j]
172
+ MCMD::errorLog("filter= cannot take same values")
173
+ raise ArgumentError
174
+ end
175
+ }
176
+ }
177
+
178
+ if filter.size>3
179
+ MCMD::errorLog("flter=,lb=,ub= takes parameters with 0<size<=3")
180
+ raise ArgumentError
181
+ end
182
+
183
+ filter.each{|s|
184
+ unless ["J","P","C"].index(s)
185
+ MCMD::errorLog("filter= takes J, P or C")
186
+ raise ArgumentError
187
+ end
188
+ }
189
+
190
+ filterStr=[]
191
+ (0...filter.size).each{|i|
192
+ if filter[i]=="J"
193
+ filterStr[i]="jaccard"
194
+ elsif filter[i]=="P"
195
+ filterStr[i]="PMI"
196
+ elsif filter[i]=="C"
197
+ filterStr[i]="confidence"
198
+ end
199
+ }
200
+
201
+ lbStr=[]
202
+ lbStr << (lb and lb[0]) ? lb[0]:0
203
+ lbStr << (lb and lb[1]) ? lb[1]:0
204
+ lbStr << (lb and lb[2]) ? lb[2]:0
205
+
206
+ ubStr=[]
207
+ ubStr << (ub and ub[0]) ? ub[0]:1
208
+ ubStr << (ub and ub[1]) ? ub[1]:1
209
+ ubStr << (ub and ub[2]) ? ub[2]:1
210
+
211
+ end
212
+
213
+ # chicking parameter for sim=
214
+ (0...sim.size-1).each{|i|
215
+ (i...sim.size).each{|j|
216
+ next if i==j
217
+ if sim[i]==sim[j]
218
+ MCMD::errorLog("sim= cannot take same values")
219
+ raise ArgumentError
220
+ end
221
+ }
222
+ }
223
+
224
+ if sim.size>3
225
+ MCMD::errorLog("sim=,dir=,rank= takes parameters with 0<size<=3")
226
+ raise ArgumentError
227
+ end
228
+
229
+ unless sim.size==dir.size and dir.size==rank.size
230
+ MCMD::errorLog("sim=,dir=,rank= must take same size of parameters")
231
+ raise ArgumentError
232
+ end
233
+
234
+ sim.each{|s|
235
+ unless ["S","J","P","C"].index(s)
236
+ MCMD::errorLog("sim= takes S, J, P or C")
237
+ raise ArgumentError
238
+ end
239
+ }
240
+
241
+ dir.each{|s|
242
+ unless ["b","m","x"].index(s)
243
+ MCMD::errorLog("dir= takes b, m, x")
244
+ raise ArgumentError
245
+ end
246
+ }
247
+
248
+ rank.each{|s|
249
+ if s.to_i<0
250
+ MCMD::errorLog("rank= takes positive integer")
251
+ raise ArgumentError
252
+ end
253
+ }
254
+
255
+ simStr=[]
256
+ (0...sim.size).each{|i|
257
+ if sim[i]=="S"
258
+ simStr[i]="support"
259
+ elsif sim[i]=="J"
260
+ simStr[i]="jaccard"
261
+ elsif sim[i]=="P"
262
+ simStr[i]="PMI"
263
+ elsif sim[i]=="C"
264
+ simStr[i]="confidence"
265
+ end
266
+ }
267
+
268
+ orFile = args. file("ro=", "w")
269
+ onFile = args. file("no=", "w")
270
+ oeFile = args. file("eo=", "w")
271
+
272
+ # ============
273
+ # entry point
274
+ temp=MCMD::Mtemp.new
275
+ xxsimgN=temp.file
276
+ xxsimgE0=temp.file
277
+ xxsimgE=temp.file
278
+ xxfriendE=temp.file
279
+ xxrecs2=temp.file
280
+ xxfriends=temp.file
281
+ xxw=temp.file
282
+ xxf=temp.file
283
+ xxff=temp.file
284
+ xxor=temp.file
285
+
286
+ ### mtra2g.rb
287
+ param = "i=#{iFile}"
288
+ param << " tid=#{idFN}" if idFN
289
+ param << " item=#{itemFN}" if itemFN
290
+ param << " s=#{sp1}" if sp1
291
+ param << " S=#{sp2}" if sp2
292
+
293
+ #####################
294
+ # 異なる向きのconfidenceを列挙するためにsim=C th=0として双方向列挙しておく
295
+ # 出力データは倍になるが、mfriendsで-directedとすることで元が取れている
296
+ param << " sim=C"
297
+ param << " th=0"
298
+ #####################
299
+ param << " -node_support"
300
+ param << " -num" if numtp
301
+ system "mtra2gc.rb #{param} no=#{xxsimgN} eo=#{xxsimgE0}"
302
+ #puts "mtra2gc.rb #{param} no=#{xxsimgN} eo=#{xxsimgE}"
303
+ #system "cp #{xxsimgE} xxsimgE"
304
+ if filter.size>0
305
+ f=""
306
+ f << "mselnum f=#{filterStr[0]} c='[#{lb[0]},#{ubStr[0]}]' i=#{xxsimgE0} |"
307
+ f << "mselnum f=#{filterStr[1]} c='[#{lb[1]},#{ubStr[1]}]' |" if filterStr[1]
308
+ f << "mselnum f=#{filterStr[2]} c='[#{lb[2]},#{ubStr[2]}]' |" if filterStr[2]
309
+ f << "cat >#{xxsimgE}"
310
+ system(f)
311
+ else
312
+ system "mv #{xxsimgE0} #{xxsimgE}"
313
+ end
314
+
315
+ col=[
316
+ ["FF000080","FF888880"],
317
+ ["0000FF80","8888FF80"],
318
+ ["00FF0080","88FF8880"]
319
+ ]
320
+
321
+ # friendの結果dir
322
+ MCMD::mkDir(xxfriends,true)
323
+ (0...sim.size).each{|i|
324
+ param = "ei=#{xxsimgE}"
325
+ param << " ni=#{xxsimgN}"
326
+ param << " ef=node1,node2"
327
+ param << " nf=node"
328
+ param << " sim=#{simStr[i]}"
329
+ param << " -directed"
330
+ param << " dir=#{dir[i]}" if dir[i]
331
+ param << " rank=#{rank[i]}"
332
+ system "mfriends.rb #{param} eo=#{xxfriendE} no=#{xxfriends}/n_#{i}"
333
+
334
+ #system "msortf f=node1,node2,#{simStr[i]}%nr i=#{xxfriendE}"
335
+
336
+ # 双方向枝を統合するする
337
+ # 枝が2本=双方向枝を選択
338
+ f=""
339
+ f << "mfsort f=node1,node2 i=#{xxfriendE} |"
340
+ f << "msummary k=node1,node2 f=#{simStr[i]} c=count,mean |"
341
+ # node1%0,node2%1,fld,count,mean
342
+ # a,b,support,2,0.1818181818
343
+ # a,d,support,2,0.1818181818
344
+ f << "mselstr f=count v=2 o=#{xxrecs2}"
345
+ system(f)
346
+ #system "msortf f=node1,node2 i=#{xxrecs2}"
347
+
348
+ f=""
349
+ f << "mjoin k=node1,node2 K=node1,node2 m=#{xxrecs2} f=mean:s1 -n i=#{xxfriendE} |"
350
+ f << "mjoin k=node2,node1 K=node1,node2 m=#{xxrecs2} f=mean:s2 -n |"
351
+ # 1) xxrecs2でsimをjoinできない(s1,s2共にnull)ということは、それは片方向枝なので"F"をつける
352
+ # 2) 双方向枝a->b,b->aのうちa->bのみ(s1がnullでない)に"W"の印をつける。
353
+ # 3) それ以外の枝は"D"として削除
354
+ f << "mcal c='if(isnull($s{s1}),if(isnull($s{s2}),\"F\",\"D\"),\"W\")' a=dir |"
355
+ f << "mselstr f=dir v=D -r |"
356
+ f << "mcal c='if($s{dir}==\"W\",$s{s1},$s{#{simStr[i]}})' a=sim |"
357
+ f << "mchgstr f=dir:color c=W:#{col[i][0]},F:#{col[i][1]} -A |"
358
+ f << "msetstr v=#{simStr[i]},#{i} a=simType,simPriority |"
359
+ f << "mcut f=simType,simPriority,node1,node2,sim,dir,color o=#{xxfriends}/e_#{i}"
360
+ system(f)
361
+ # node1%1,node2%0,simType,sim,dir,color
362
+ # b,a,jaccard,0.3333333333,F,8888FF
363
+ # j,c,jaccard,0.3333333333,F,8888FF
364
+ # b,d,jaccard,0.3333333333,F,8888FF
365
+ # a,e,jaccard,0.5,W,0000FF
366
+ # d,e,jaccard,0.5,W,0000FF
367
+ }
368
+
369
+ # rule fileの出力
370
+ if orFile
371
+ system "mcat i=#{xxfriends}/e_* | muniq k=node1,node2 o=#{xxor}"
372
+ f=""
373
+ f << "mcommon k=node1,node2 m=#{xxor} i=#{xxsimgE} o=#{orFile}"
374
+ system(f)
375
+ end
376
+
377
+ # マルチ枝の単一化(W優先,パラメータ位置優先)
378
+ if prune
379
+ # 双方向と片方向に分割
380
+ f=""
381
+ f << "mcat i=#{xxfriends}/e_* |"
382
+ f << "mselstr f=dir v=W o=#{xxw} u=#{xxf}"
383
+ system(f)
384
+ #puts "----------xxw"
385
+ #system "cat #{xxw}"
386
+ #puts "----------xxf"
387
+ #system "cat #{xxf}"
388
+ # 片方向のみの枝を選択
389
+ f=""
390
+ f << "mcommon k=node1,node2 K=node1,node2 -r m=#{xxw} i=#{xxf} |"
391
+ f << "mcommon k=node1,node2 K=node2,node1 -r m=#{xxw} o=#{xxff}"
392
+ system(f)
393
+ #puts "----------xxff"
394
+ #system "cat #{xxff}"
395
+
396
+ # catして、双方向がダブってたら単一化する
397
+ f=""
398
+ f << "mcat i=#{xxw},#{xxff} |"
399
+ f << "mbest k=node1,node2 s=dir%r,simPriority%n o=#{oeFile}"
400
+ system(f)
401
+ else
402
+ system "mcat i=#{xxfriends}/e_* o=#{oeFile}"
403
+ end
404
+ system "mv #{xxfriends}/n_0 #{onFile}"
405
+
406
+ #system "m2gv.rb -noiso ni=#{onFile} nf=node nv=support ei=#{oeFile} ef=node1,node2 ed=dir ec=color ev=sim -d o=#{dotFile}"
407
+
408
+ # end message
409
+ MCMD::endLog(args.cmdline)
410
+