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/mccomp.rb ADDED
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+
7
+ # 1.0 initial development: 2016/10/17
8
+ # 1.1 出力のnode項目名をnf=の値にする: 2016/11/11
9
+ $cmd="mccomp2g.rb"
10
+ $version="1.1"
11
+
12
+ def help
13
+
14
+ STDERR.puts <<EOF
15
+ ----------------------------
16
+ #{$cmd} version #{$version}
17
+ ----------------------------
18
+ 概要) 連結成分を出力する
19
+
20
+ 用法) #{$cmd} ei= ef= [ni=] [nf=] [o=] [T=] [-verbose] [-mcmdenv] [--help]
21
+
22
+ ファイル名指定
23
+ ei= : 枝データファイル
24
+ ef= : 枝データ上の2つの節点項目名(省略時は"node1,node2")
25
+ ni= : 節点データファイル
26
+ nf= : 節点データ上の節点項目名(省略時は"node")
27
+ o= : 出力ファイル(連結成分ID-枝:-nodeを指定することでクリークID-節点に変更可能,省略時は標準出力)
28
+
29
+ その他
30
+ T= : ワークディレクトリ(default:/tmp)
31
+ -verbose : Rの実行ログを出力
32
+ --help : ヘルプの表示
33
+
34
+ 入力形式)
35
+ 一般グラフを節点ペアで表現した形式。
36
+
37
+ o=の出力形式)
38
+ 節点と連結成分IDを出力する。
39
+ 出力項目は"id,node,size"の3項目である。
40
+ sizeは連結成分を構成する節点数である。
41
+
42
+ 例)
43
+ $ cat data/edge.csv
44
+ n1,n2
45
+ a,d
46
+ a,e
47
+ b,f
48
+ d,e
49
+ f,g
50
+ g,b
51
+ g,h
52
+
53
+ $ #{$cmd} ei=edge.csv ef=n1,n2 o=output.csv
54
+ ##END# #{$cmd} ei=edge.csv ef=n1,n2 -node o=output.csv
55
+ $ cat output.csv
56
+ id%0,node,size
57
+ 1,a,3
58
+ 1,d,3
59
+ 1,e,3
60
+ 2,b,4
61
+ 2,f,4
62
+ 2,g,4
63
+ 2,h,4
64
+
65
+ 例) 節点ファイルも指定した例
66
+ $ cat node.csv
67
+ n
68
+ a
69
+ b
70
+ c
71
+ d
72
+ e
73
+ f
74
+ g
75
+ h
76
+
77
+ $ #{$cmd} ei=edge.csv ef=n1,n2 ni=node.csv nf=n o=output.csv
78
+ #END# #{$cmd} ei=edge.csv o=output.csv ef=n1,n2 ni=node.csv nf=n
79
+ $ cat output.csv
80
+ id%0,node,size
81
+ 1,a,3
82
+ 1,d,3
83
+ 1,e,3
84
+ 2,b,4
85
+ 2,f,4
86
+ 2,g,4
87
+ 2,h,4
88
+ 3,c,1
89
+ 4,i,1
90
+
91
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
92
+ EOF
93
+ exit
94
+ end
95
+
96
+ def ver()
97
+ STDERR.puts "version #{$version}"
98
+ exit
99
+ end
100
+
101
+ help() if ARGV.size <= 0 or ARGV[0]=="--help"
102
+ ver() if ARGV[0]=="--version"
103
+
104
+ args=MCMD::Margs.new(ARGV,"ei=,ef=,ni=,nf=,o=,-verbose","ei=,ef=")
105
+
106
+ # Rライブラリ実行可能確認
107
+ exit(1) unless(MCMD::chkRexe("igraph"))
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
+ ei = args. file("ei=","r") # edgeファイル名
118
+ ni = args. file("ni=","r") # node 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
+ # ---- node field name on ni=
124
+ nf = args.field("nf=", ni, "node",1,1)
125
+ nf = nf["names"][0] if nf
126
+
127
+ oFile = args.file("o=", "w")
128
+
129
+ def genRscript(eFile,oFile,cidFile,scpFile)
130
+ r_proc = <<EOF
131
+ library(igraph)
132
+ ## reading edge file
133
+ g=read.graph("#{eFile}",format="edgelist",directed=FALSE)
134
+ c=components(g)
135
+ seq=0:(length(c$membership)-1)
136
+ dat=data.frame(id=c$membership,nid=seq,size=c$csize[c$membership])
137
+ write.csv(dat,file="#{oFile}",quote=FALSE,row.names = FALSE)
138
+ write.table(max(c$membership),file="#{cidFile}",col.names = FALSE,row.names = FALSE)
139
+ EOF
140
+
141
+ File.open(scpFile,"w"){|fpw|
142
+ fpw.write(r_proc)
143
+ }
144
+ end
145
+
146
+
147
+ def conv2num(eFile,nFile,ef1,ef2,nf,numFile,mapFile,isoFile)
148
+
149
+ wf=MCMD::Mtemp.new
150
+ xxn1=wf.file
151
+ xxn2=wf.file
152
+ xxn3=wf.file
153
+ xxeNodeMF=wf.file
154
+
155
+ # create a nodes list that are included in node and edge data
156
+ system "mcut f=#{ef1}:node i=#{eFile} o=#{xxn1}"
157
+ system "mcut f=#{ef2}:node i=#{eFile} o=#{xxn2}"
158
+ unless nFile
159
+ system "echo node >#{xxn3}"
160
+ else
161
+ system "mcut f=#{nf}:node i=#{nFile} o=#{xxn3}"
162
+ end
163
+
164
+ # xxeNodeMF : nodes list that are included in edge
165
+ system "mcat i=#{xxn1},#{xxn2} | muniq k=node | msetstr v=1 a=eNode o=#{xxeNodeMF}"
166
+
167
+ # isolate nodes list
168
+ system "mcat i=#{xxn1},#{xxn2},#{xxn3} | mcommon k=node m=#{xxeNodeMF} -r | mcut f=node o=#{isoFile}"
169
+
170
+ # create a mapping table between the original node label and the number iGraph will use
171
+ f=""
172
+ f << "mcat i=#{xxn1},#{xxn2},#{xxn3} |"
173
+ f << "muniq k=node |"
174
+ f << "mjoin k=node m=#{xxeNodeMF} f=eNode |"
175
+ f << "mnullto f=eNode v=0 |"
176
+ f << "mnumber s=eNode%r,node a=nid o=#{mapFile}"
177
+ system(f)
178
+
179
+ # create a data file that R script read
180
+ f=""
181
+ f << "mjoin k=#{ef1} K=node m=#{mapFile} f=nid:nid1 i=#{eFile} |"
182
+ f << "mjoin k=#{ef2} K=node m=#{mapFile} f=nid:nid2 |"
183
+ f << "mcut f=nid1,nid2 -nfno |"
184
+ f << "tr ',' ' ' >#{numFile}"
185
+ system(f)
186
+ end
187
+
188
+ temp=MCMD::Mtemp.new
189
+ numFile=temp.file
190
+ mapFile=temp.file
191
+ isoFile=temp.file
192
+ cluFile=temp.file
193
+ cidFile=temp.file
194
+ scpFile=temp.file
195
+ iscFile=temp.file
196
+ clnFile=temp.file
197
+ conv2num(ei,ni,ef1,ef2,nf,numFile,mapFile,isoFile)
198
+ genRscript(numFile,cluFile,cidFile,scpFile)
199
+
200
+ if args.bool("-verbose") then
201
+ system "R --vanilla -q < #{scpFile} "
202
+ else
203
+ system "R --vanilla -q --slave < #{scpFile} 2>/dev/null"
204
+ end
205
+ cid=`cat #{cidFile}`.to_i
206
+
207
+ f=""
208
+ f << "mnumber s=node S=#{cid+1} a=id i=#{isoFile} |"
209
+ f << "msetstr v=1 a=size |"
210
+ f << "mcut f=id,node,size o=#{iscFile}"
211
+ system(f)
212
+
213
+ # #{cluFile}
214
+ # id,nid,size
215
+ # 1,0,3
216
+ # 2,1,4
217
+ # 1,2,3
218
+ # 1,3,3
219
+ # 2,4,4
220
+ # 2,5,4
221
+ # 2,6,4
222
+ f=""
223
+ f << "mjoin k=nid m=#{mapFile} i=#{cluFile} f=node |"
224
+ f << "mcut f=id,node,size o=#{clnFile}"
225
+ system(f)
226
+
227
+ f=""
228
+ f << "mcat i=#{clnFile},#{iscFile} |"
229
+ f << "mfldname f=node:#{nf} |" if nf
230
+ f << "msortf f=id o=#{oFile}"
231
+ system(f)
232
+
233
+ # end message
234
+ MCMD::endLog(args.cmdline)
235
+
data/bin/mclique.rb ADDED
@@ -0,0 +1,295 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+ require "nysol/take"
7
+
8
+ # ver="1.0" # 初期リリース 2014/2/20
9
+ # ver="1.1" # eo=,no=の機能追加 2014/3/27
10
+ # ver="1.2" # ni=,nf=の追加, eo=,no=の機能をmclique2g.rbに分離, 枝出力を廃止(-nodeによる出力のみ) 2014/8/2
11
+ $cmd=$0.sub(/.*\//,"")
12
+ $version="1.2"
13
+
14
+ def help
15
+ STDERR.puts <<EOF
16
+ ----------------------------
17
+ #{$cmd} version #{$version}
18
+ ----------------------------
19
+ 概要) 一般グラフデータから極大クリークを列挙する。
20
+ 書式) #{$cmd} ei= ef= [ni=] [nf=] [o=] [l=] [u=] [-node] [-all] [log=] [T=] [--help]
21
+
22
+ ファイル名指定
23
+ ei= : 枝データファイル
24
+ ef= : 枝データ上の2つの節点項目名(省略時は"node1,node2")
25
+ ni= : 節点データファイル
26
+ nf= : 節点データ上の節点項目名(省略時は"node")
27
+ o= : 出力ファイル(クリークID-枝:-nodeを指定することでクリークID-節点に変更可能,省略時は標準出力)
28
+ l= : クリークを構成する最小節点数(ここで指定したサイズより小さいクリークは列挙されない)
29
+ u= : クリークを構成する最大節点数(ここで指定したサイズより大きいクリークは列挙されない)
30
+ -all : 極大クリークだけでなく、全クリークを列挙する。
31
+ log= : パラメータの設定値をkey-value形式のCSVで保存するファイル名
32
+
33
+ その他
34
+ T= : ワークディレクトリ(default:/tmp)
35
+ --help : ヘルプの表示
36
+
37
+ 入力形式)
38
+ 一般グラフを節点ペアで表現した形式。
39
+ 他のいかなる節点とも接続のない節点は、サイズが1の自明なクリークであるため、入力対象外とする。
40
+
41
+ o=の出力形式)
42
+ クリークIDと接点を出力する。
43
+ 出力項目は"id,node,size"の3項目である。
44
+ sizeはクリークを構成する節点数である。
45
+
46
+ 備考)
47
+ 内部で起動しているコマンドmaceは0から始まる整数で指定された節点名を前提として処理する。
48
+ 一方で本コマンドは、任意の文字列で節点名を表したデータを処理できる。
49
+ それは、maceを実行する前に、それら文字列と整数との対応表を前処理で作成しているからである。
50
+
51
+ 例)
52
+ $ cat data/edge.csv
53
+ n1,n2
54
+ a,b
55
+ a,c
56
+ a,d
57
+ b,c
58
+ b,d
59
+ b,e
60
+ c,d
61
+ d,e
62
+
63
+ $ #{$cmd} ei=edge.csv ef=n1,n2 o=output.csv
64
+ #MSG# converting graph files into a pair of numbered nodes ...; 2014/01/06 14:27:17
65
+ #MSG# converting the numbered nodes into original name ...; 2014/01/06 14:27:17
66
+ #END# #{$cmd} ei=data/edge1.csv ef=n1,n2 -node o=output.csv; 2014/01/06 14:27:17
67
+ $ cat output.csv
68
+ id,node,size
69
+ 0,b,3
70
+ 0,d,3
71
+ 0,e,3
72
+ 1,a,4
73
+ 1,b,4
74
+ 1,c,4
75
+ 1,d,4
76
+
77
+ 例) 節点ファイルも指定した例
78
+ $ cat edge.csv
79
+ n1,n2
80
+ c,a
81
+ c,d
82
+ d,e
83
+ a,d
84
+ a,e
85
+
86
+ $ cat node.csv
87
+ n
88
+ a
89
+ b
90
+ c
91
+ d
92
+ e
93
+ f
94
+
95
+ $ #{$cmd} ei=edge.csv ef=n1,n2 ni=node.csv nf=n o=output.csv
96
+ #MSG# converting graph files into a pair of numbered nodes ...; 2014/01/06 14:27:17
97
+ #MSG# converting the numbered nodes into original name ...; 2014/01/06 14:27:17
98
+ #END# #{$cmd} ei=data/edge1.csv ef=n1,n2 -node o=output.csv; 2014/01/06 14:27:17
99
+ $ cat output.csv
100
+ id,node,size
101
+ 0,b,1
102
+ 1,a,3
103
+ 1,d,3
104
+ 1,e,3
105
+ 2,a,3
106
+ 2,c,3
107
+ 2,d,3
108
+ 3,f,1
109
+
110
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
111
+ EOF
112
+ exit
113
+ end
114
+
115
+ def ver()
116
+ STDERR.puts "version #{$version}"
117
+ exit
118
+ end
119
+
120
+ help() if ARGV.size <= 0 or ARGV[0]=="--help"
121
+ ver() if ARGV[0]=="--version"
122
+
123
+ args=MCMD::Margs.new(ARGV,"ei=,ef=,ni=,nf=,-all,o=,l=,u=,log=","ei=,ef=")
124
+
125
+ # コマンド実行可能確認
126
+ #CMD_mace="mace_20140215"
127
+ #exit(1) unless(MCMD::chkCmdExe(CMD_mace, "executable"))
128
+
129
+ # mcmdのメッセージは警告とエラーのみ
130
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
131
+
132
+ #ワークファイルパス
133
+ if args.str("T=")!=nil then
134
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
135
+ end
136
+
137
+ all=args.bool("-all")
138
+
139
+ ei = args. file("ei=","r") # edgeファイル名
140
+ ni = args. file("ni=","r") # node file name
141
+
142
+ # ---- edge field names (two nodes) on ei=
143
+ ef1,ef2 = args.field("ef=", ei, "node1,node2",2,2)["names"]
144
+
145
+ # ---- node field name on ni=
146
+ nf = args.field("nf=", ni, "node",1,1)
147
+ nf = nf["names"][0] if nf
148
+
149
+ minSize = args.int("l=") # クリークサイズ下限
150
+ maxSize = args.int("u=") # クリークサイズ上限
151
+ oFile = args.file("o=", "w")
152
+ logFile = args.file("log=", "w")
153
+
154
+ def g2pair(ni,nf,ei,ef1,ef2,ipair,mapFile)
155
+ MCMD::msgLog("converting graph files into a pair of numbered nodes ...")
156
+ wf=MCMD::Mtemp.new
157
+ wf1=wf.file
158
+ wf2=wf.file
159
+ wf3=wf.file
160
+
161
+ system "mcut f=#{ef1}:node i=#{ei} o=#{wf1}"
162
+ system "mcut f=#{ef2}:node i=#{ei} o=#{wf2}"
163
+ system "mcut f=#{nf}:node i=#{ni} o=#{wf3}" if ni
164
+
165
+ f=""
166
+ if ni
167
+ f << "mcat i=#{wf1},#{wf2},#{wf3} f=node |"
168
+ else
169
+ f << "mcat i=#{wf1},#{wf2} f=node |"
170
+ end
171
+ f << "msortf f=node |"
172
+ f << "muniq k=node |"
173
+ f << "mnumber s=node a=num o=#{mapFile}"
174
+ system(f)
175
+
176
+ f=""
177
+ f << "mcut f=#{ef1},#{ef2} i=#{ei} |"
178
+ f << "msortf f=#{ef1} |"
179
+ f << "mjoin k=#{ef1} K=node m=#{mapFile} f=num:num1 |"
180
+ f << "msortf f=#{ef2} |"
181
+ f << "mjoin k=#{ef2} K=node m=#{mapFile} f=num:num2 |"
182
+ f << "mcut f=num1,num2 |"
183
+ f << "mfsort f=num1,num2 |"
184
+ f << "msortf f=num1%n,num2%n -nfno o=#{ipair}"
185
+ system(f)
186
+ end
187
+
188
+ # ============
189
+ # entry point
190
+ t=Time.now
191
+
192
+ # 入力ファイルをノード番号ペアデータ(input)に変換する。
193
+ # csvで指定された場合は、番号-アイテムmapデータも作成(xxmap)。
194
+ wf=MCMD::Mtemp.new
195
+ xxinp=wf.file
196
+ xxmap=wf.file
197
+ input=ei
198
+
199
+ g2pair(ni,nf,ei,ef1,ef2,xxinp,xxmap)
200
+ input=xxinp
201
+
202
+ xxmace = wf.file # maceの出力(tra形式)
203
+ xxpair = wf.file # 上記traをpair形式に変換したデータ
204
+
205
+ # mace実行
206
+ f="Me"
207
+ f="Ce" if all
208
+ f << " -l #{minSize}" if minSize
209
+ f << " -u #{maxSize}" if maxSize
210
+ #f << " -S #{maxOut}" if maxOut
211
+ f << " #{input} #{xxmace}"
212
+ #system(f)
213
+ TAKE::run_mace(f)
214
+
215
+ MCMD::msgLog("converting the numbered nodes into original name ...")
216
+
217
+ id=0
218
+ fld="id,num,size"
219
+ MCMD::Mcsvout.new("o=#{xxpair} f=#{fld}"){|oCSV|
220
+ # xxmace
221
+ # 4 3 1
222
+ # 3 2 1 0
223
+ MCMD::Mcsvin.new("i=#{xxmace} -nfn"){|iCsv|
224
+ iCsv.each{|flds|
225
+ items=flds[0].split(" ")
226
+ size=items.size
227
+ (0...size).each{|i|
228
+ # id-node形式による出力
229
+ ar = []
230
+ ar << id
231
+ ar << items[i]
232
+ ar << size
233
+ oCSV.write(ar)
234
+ }
235
+ id+=1
236
+ }
237
+ }
238
+ }
239
+
240
+ # when ni= specified, it add the isolated single cliques.
241
+ if ni then
242
+ xxcliq=wf.file
243
+ xxiso =wf.file
244
+ xxcat =wf.file
245
+
246
+ f=""
247
+ f << "msortf f=num i=#{xxpair} |"
248
+ f << "mselstr f=size v=1 |" if all # when -all specified
249
+ f << "mcut f=num |"
250
+ f << "msortf f=num |"
251
+ f << "muniq k=num o=#{xxcliq}"
252
+ system(f)
253
+
254
+ # select all nodes which are not included in any cliques
255
+ f=""
256
+ f << "mcut f=num i=#{xxmap} |"
257
+ f << "msortf f=num |"
258
+ f << "mcommon k=num m=#{xxcliq} -r |"
259
+ f << "mnumber S=#{id} a=id -q|"
260
+ f << "msetstr v=1 a=size |"
261
+ f << "mcut f=id,num,size o=#{xxiso}"
262
+ system(f)
263
+
264
+ system "mcat i=#{xxpair},#{xxiso} o=#{xxcat}"
265
+ system "cp #{xxcat} #{xxpair}"
266
+ end
267
+
268
+ w4=wf.file
269
+ system "msortf f=num i=#{xxmap} o=#{w4}"
270
+
271
+ # id-node形式による出力
272
+ f = ""
273
+ f << "msortf i=#{xxpair} f=num |"
274
+ f << "msortf f=num |"
275
+ f << "mjoin m=#{w4} k=num f=node |"
276
+ f << "mcut f=id,node,size |"
277
+ f << "msortf f=id,node o=#{oFile}"
278
+ system(f)
279
+
280
+ procTime=Time.now-t
281
+
282
+ # ログファイル出力
283
+ if logFile
284
+ kv=args.getKeyValue()
285
+ kv << ["time",procTime]
286
+ MCMD::Mcsvout.new("o=#{logFile} f=key,value"){|csv|
287
+ kv.each{|line|
288
+ csv.write(line)
289
+ }
290
+ }
291
+ end
292
+
293
+ # 終了メッセージ
294
+ MCMD::endLog(args.cmdline)
295
+
data/bin/mclique2g.rb ADDED
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+
7
+ # ver="1.0" # 初期リリース 2014/7/04
8
+ $cmd=$0.sub(/.*\//,"")
9
+ $version=1.0
10
+
11
+ def help
12
+ STDERR.puts <<EOF
13
+ ----------------------------
14
+ #{$cmd} version #{$version}
15
+ ----------------------------
16
+ 概要) クリークを一つの節点に変換し新たなグラフを構成する。
17
+ 書式) #{$cmd} i= [id=] [f=] eo= no= [T=] [--help]
18
+
19
+ ファイル名指定
20
+ i= : クリークファイル名
21
+ id= : クリークID項目名(デフォルト:"id")
22
+ f= : クリークを構成する節点項目名(デフォルト:"node")
23
+ eo= : 枝ファイル名
24
+ no= : 節点ファイル名
25
+
26
+ その他
27
+ T= : ワークディレクトリ(default:/tmp)
28
+ --help : ヘルプの表示
29
+
30
+ 入力データ)
31
+ クリークIDと節点の2項目からなるCSVファイル。
32
+ これはmclique.rbコマンドでのno=に出力されるデータに対応する。
33
+
34
+ 出力データ)
35
+ eo=には枝(節点ペア)データ、no=には節点データが、以下の項目で出力される。
36
+ eo=: node1,node2,weight
37
+ node1,node2: 入力データのクリークIDを節点番号とする枝データ。
38
+ weight: 2つのクリークの共通節点数。
39
+ no=: node,weight
40
+ node: 入力データのクリークIDを節点番号とする枝データ。
41
+ weight: クリークを構成していた節点数。
42
+
43
+ 例)
44
+
45
+ # Copyright(c) NYSOL 2014- All Rights Reserved.
46
+ EOF
47
+ exit
48
+ end
49
+
50
+ def ver()
51
+ STDERR.puts "version #{$version}"
52
+ exit
53
+ end
54
+
55
+ help() if ARGV[0]=="--help" or ARGV.size <= 0
56
+ ver() if ARGV[0]=="--version"
57
+
58
+ args=MCMD::Margs.new(ARGV,"i=,id=,f=,eo=,no=,T=","i=,eo=,no=")
59
+
60
+ # mcmdのメッセージは警告とエラーのみ
61
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
62
+
63
+ #ワークファイルパス
64
+ if args.str("T=")!=nil then
65
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
66
+ end
67
+
68
+ iFile = args.file("i=" ,"r") # i=
69
+ eoFile = args.file("eo=","w") # eo=
70
+ noFile = args.file("no=","w") # no=
71
+
72
+ ## id=
73
+ id=args.field("id=",iFile,"id",1,1)["names"][0]
74
+
75
+ ## f=
76
+ node = args.field("f=", iFile, "node", 1, 1)["names"][0]
77
+
78
+ wf=MCMD::Mtemp.new
79
+ xxbase=wf.file
80
+
81
+ # cleaning
82
+ f=""
83
+ f << "mcut f=#{id},#{node} i=#{iFile} |"
84
+ f << "msortf f=#{id},#{node} |"
85
+ f << "muniq k=#{id},#{node} o=#{xxbase}"
86
+ system(f)
87
+
88
+ f=""
89
+ f << "mcut f=#{id}:node i=#{xxbase} |"
90
+ f << "msortf f=node |"
91
+ f << "mcount k=node a=weight o=#{noFile}"
92
+ system(f)
93
+
94
+ f=""
95
+ f << "msortf f=#{node} i=#{xxbase} |"
96
+ f << "mcombi k=#{node} f=#{id} n=2 a=node1,node2 |"
97
+ f << "mfsort f=node1,node2 |"
98
+ f << "msortf f=node1,node2 |"
99
+ f << "mcount k=node1,node2 a=weight |"
100
+ f << "mcut f=node1,node2,weight o=#{eoFile}"
101
+ system(f)
102
+
103
+ # end message
104
+ MCMD::endLog(args.cmdline)
105
+