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
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+
7
+ # ver="1.0" # 初期リリース 2014/2/20
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=] [o=] [T=] [--help]
18
+
19
+ ファイル名指定
20
+ i= : クリークデータファイル名
21
+ id= : クリークID項目名(デフォルト: "id")
22
+ f= : クリークを構成する節点項目名(デフォルト: "node")
23
+ o= : 出力ファイル名
24
+
25
+ その他
26
+ T= : ワークディレクトリ(default:/tmp)
27
+ --help : ヘルプの表示
28
+
29
+ 入力データ)
30
+ クリークIDと節点の2項目からなるCSVファイル。
31
+ mclique.rb コマンドで-nodeを指定して出力されるデータファイル。
32
+
33
+ 出力データ1)
34
+ クリーク別に以下の項目を出力する。
35
+ nSize: クリークを構成するnode数
36
+ eSize: クリークを構成する枝数(nSize(nSize-1)/2)
37
+ extNodes: 外部接続節点数
38
+ extEdges: 外部接続枝数
39
+ extCliques: 外部接続クリーク数
40
+
41
+ 出力データ2)
42
+ ノード別に以下の項目を出力する。
43
+ degree: 次数(接続節点数)
44
+ cliques: 所属するクリーク数
45
+ size: 所属する最大クリークサイズ-最小クリークサイズ
46
+
47
+ 例)
48
+
49
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
50
+ EOF
51
+ exit
52
+ end
53
+
54
+ def ver()
55
+ STDERR.puts "version #{$version}"
56
+ exit
57
+ end
58
+
59
+ help() if ARGV[0]=="--help" or ARGV.size <= 0
60
+ ver() if ARGV[0]=="--version"
61
+
62
+ args=MCMD::Margs.new(ARGV,"i=,id=,f=,o=,T=","i=")
63
+
64
+ # mcmdのメッセージは警告とエラーのみ
65
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
66
+
67
+ #ワークファイルパス
68
+ if args.str("T=")!=nil then
69
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
70
+ end
71
+
72
+ iFile = args.file("i=","r") # i=
73
+ oFile = args.file("o=","w") # o=
74
+
75
+ ## id=
76
+ id=args.field("id=",iFile,"id")["names"][0] # id項目名
77
+
78
+ ## f=
79
+ node = args.field("f=", iFile, "node",1,1)["names"][0]
80
+
81
+ wf=MCMD::Mtemp.new
82
+ xxid_node=wf.file
83
+ xxnSize=wf.file
84
+ xxedge=wf.file
85
+
86
+ # i=のサンプル
87
+ # id,node
88
+ # 0,a
89
+ # 0,b
90
+ # 0,c
91
+ # 0,d
92
+ # 1,d
93
+ # 1,e
94
+ # 1,f
95
+ # 2,e
96
+ # 2,f
97
+ # 2,g
98
+ # 3,e
99
+ # 3,f
100
+ # 3,h
101
+
102
+ # nodeマスタ
103
+ f=""
104
+ f << "mcut f=#{id}:__id,#{node}:node i=#{iFile} |"
105
+ f << "msortf f=__id,node |"
106
+ f << "muniq k=__id,node o=#{xxid_node}"
107
+ system(f)
108
+
109
+ # nSize: クリーク別接点数、枝数のカウント
110
+ f=""
111
+ f << "mcount k=__id a=nSize i=#{xxid_node} |"
112
+ f << "mcal c='${nSize}*(${nSize}-1)/2' a=eSize o=#{xxnSize}"
113
+ system(f)
114
+
115
+ # edgeマスタ
116
+ f=""
117
+ f << "mcombi k=__id f=node n=2 -p a=node1,node2 i=#{xxid_node} |"
118
+ f << "mcut f=node -r |"
119
+ f << "msortf f=node1,node2,__id o=#{xxedge}"
120
+ system(f)
121
+
122
+ xxextLink=wf.file
123
+ xxextNodes=wf.file
124
+ xxextEdges=wf.file
125
+ xxextCliques=wf.file
126
+
127
+ # xxid_node xxedge xxextLin
128
+ # __id,node __id,node1,node2 __id,node,node2,__id2
129
+ # 0,a 0,a,b 0,d,e,1
130
+ # 0,b 0,a,c 0,d,f,1
131
+ # 0,c 0,a,d 1,d,a,0
132
+ # 0,d 0,b,a 1,d,b,0
133
+ # 1,d 0,b,c 1,d,c,0
134
+ # 1,e 0,b,d 1,e,g,2
135
+ # 1,f 0,c,a 1,f,g,2
136
+ # 2,e 0,c,b 1,e,h,3
137
+ # 2,f 0,c,d 1,f,h,3
138
+ # 2,g 0,d,a 2,f,d,1
139
+ # 3,e 0,d,b 2,e,d,1
140
+ # 3,f 0,d,c 2,e,h,3
141
+ # 3,h 1,d,e 2,f,h,3
142
+ # 1,d,f 3,e,d,1
143
+ # 1,e,d 3,f,d,1
144
+ # 1,e,f 3,f,g,2
145
+ # 2,e,f 3,e,g,2
146
+ # 3,e,f
147
+ # 2,e,g
148
+ # 3,e,h
149
+ # 1,f,d
150
+ # 1,f,e
151
+ # 2,f,e
152
+ # 3,f,e
153
+ # 2,f,g
154
+ # 3,f,h
155
+ # 2,g,e
156
+ # 2,g,f
157
+ # 3,h,e
158
+ # 3,h,f
159
+ f=""
160
+ f << "msortf f=node i=#{xxid_node} |"
161
+ f << "mnjoin k=node m=#{xxedge} K=node1 f=node2,__id:__id2 |" # クリークの節点から接続されている節点を全て結合
162
+ f << "msel c='${__id}!=${__id2}' |" # 結合された節点が元のクリークと同じものは削除
163
+ f << "msortf f=__id,node2 |"
164
+ f << "mcommon k=__id,node2 K=__id,node m=#{xxid_node} -r o=#{xxextLink}" # remove the nodes included in the same clique
165
+ system(f)
166
+
167
+ # 外部接続節点本数
168
+ f=""
169
+ f << "mcut f=__id,node2 i=#{xxextLink} |"
170
+ f << "msortf f=__id,node2 |"
171
+ f << "muniq k=__id,node2 |"
172
+ f << "mcount k=__id a=extNodes o=#{xxextNodes}"
173
+ system(f)
174
+
175
+ # 外部接続枝本数
176
+ f=""
177
+ f << "mcut f=__id i=#{xxextLink} |"
178
+ f << "msortf f=__id |"
179
+ f << "mcount k=__id a=extEdges o=#{xxextEdges}"
180
+ system(f)
181
+
182
+ # 外部接続クリーク数
183
+ f=""
184
+ f << "msortf f=__id,__id2 i=#{xxextLink} |"
185
+ f << "muniq k=__id,__id2 |"
186
+ f << "mcut f=__id |"
187
+ f << "msortf f=__id |"
188
+ f << "mcount k=__id a=extCliques o=#{xxextCliques}"
189
+ system(f)
190
+
191
+ # 全項目結合
192
+ f=""
193
+ f << "mcut f=__id,nSize,eSize i=#{xxnSize} |"
194
+ f << "mjoin k=__id m=#{xxextNodes} f=extNodes -n |"
195
+ f << "mjoin k=__id m=#{xxextEdges} f=extEdges -n |"
196
+ f << "mjoin k=__id m=#{xxextCliques} f=extCliques -n |"
197
+ f << "mnullto f=* v=0 |"
198
+ f << "mfldname f=__id:#{id} o=#{oFile}"
199
+ system(f)
200
+
201
+ # 終了メッセージ
202
+ MCMD::endLog(args.cmdline)
203
+
data/bin/mfriends.rb ADDED
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+ require "set"
7
+
8
+ # ver="1.0" # 初期リリース 2016/10/2
9
+ # ver="1.1" -pal,rank2=,-udout追加 2016/12/13
10
+ # ver="1.2" rank2=削除,-palの意味を変更 2016/12/25
11
+ $cmd=$0.sub(/.*\//,"")
12
+ $version="1.2"
13
+
14
+ def help
15
+ STDERR.puts <<EOF
16
+ ----------------------------
17
+ #{$cmd} version #{$version}
18
+ ----------------------------
19
+ 概要) 相互類似関係にある枝を選択する。
20
+ 内容) グラフG=(V,E)の任意の枝(a,b)∈E について条件b∈A and a∈Bを満たす枝を選択する。
21
+ ここで、A(B)は節点a(b)の隣接節点の内、類似度が上位r個の節点集合のこと。
22
+ rはrank=で指定し、類似度(項目)はsim=で指定する。
23
+ 結果は有向グラフとして出力される。例えば節点a,bが相互類似関係にあれば、a->b,b->aの両枝が出力される。
24
+ 書式) #{$cmd} ei= [ef=] [ni=] [nf=] eo= [no=] [sim=] [dir=b|m|x] [-directed] [T=] [--help]
25
+
26
+ ファイル名指定
27
+ ei= : 枝データファイル
28
+ ef= : 枝データ上の2つの節点項目名(省略時は"node1,node2")
29
+ ni= : 節点データファイル
30
+ nf= : 節点データ上の節点項目名(省略時は"node")
31
+ eo= : データ研磨後の枝データファイル
32
+ no= : データ研磨後の節点データファイル
33
+ rank= : 類似度上位何個までの隣接節点を対象とするか(省略時は3)
34
+ sim= : rank=で使う節点間類似度(枝の重み)項目名。
35
+ dir= : b:双方向類似枝のみ出力する(デフォルト)
36
+ : m:片方向類似枝のみ出力する
37
+ : x:双方向類似枝、片方向類似枝両方共出力する。
38
+ -directed: 有向グラフとみなして計算する。
39
+ -udout: 無向グラフとして出力する。両方向に枝がある場合(a->b,b->a)の枝はa-bとして出力される。
40
+ a->b,b->aで類似度が異なる場合は平均値が出力される。
41
+
42
+ その他
43
+ T= : ワークディレクトリ(default:/tmp)
44
+ --help : ヘルプの表示
45
+
46
+ 例) 基本例
47
+ $ cat edge.csv
48
+ n1,n2,sim
49
+ a,b,0.40
50
+ a,c,0.31
51
+ a,d,0.31
52
+ b,c,0.20
53
+ b,d,0.24
54
+ b,e,0.14
55
+ c,d,0.30
56
+ d,e,0.09
57
+ $ #{$cmd} ei=edge.csv ef=n1,n2 sim=sim rank=2 eo=output.csv
58
+ #END# #{$cmd} ei=edge.csv ef=n1,n2 sim=sim rank=2 eo=output.csv; 2016/10/02 09:58:22
59
+ $ cat output.csv
60
+ n1%0,n2%1,sim
61
+ a,b,0.40
62
+ a,c,0.31
63
+ a,d,0.31
64
+ b,a,0.40
65
+ c,a,0.31
66
+ c,d,0.30
67
+ d,a,0.31
68
+ d,c,0.30
69
+
70
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
71
+ EOF
72
+ exit
73
+ end
74
+
75
+ def ver()
76
+ STDERR.puts "version #{$version}"
77
+ exit
78
+ end
79
+
80
+ help() if ARGV.size <= 0 or ARGV[0]=="--help"
81
+ ver() if ARGV[0]=="--version"
82
+
83
+ args=MCMD::Margs.new(ARGV,"ni=,nf=,ei=,ef=,eo=,no=,sim=,rank=,dir=,-directed,-udout","ei=,ef=,sim=")
84
+
85
+ # mcmdのメッセージは警告とエラーのみ
86
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
87
+
88
+ #ワークファイルパス
89
+ if args.str("T=")!=nil then
90
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
91
+ end
92
+
93
+ ei = args. file("ei=","r") # edge file name
94
+ ni = args. file("ni=","r") # node file name
95
+
96
+ # ---- edge field names (two nodes) on ei=
97
+ ef1,ef2 = args.field("ef=", ei, nil,2,2)["names"]
98
+
99
+ # ---- node field name on ni=
100
+ nf = args.field("nf=", ni, nil,1,1)
101
+ nf = nf["names"][0] if nf
102
+
103
+ sim = args.field("sim=",ei,nil,1,1)["names"][0] # similarity measure
104
+ rank = args.int("rank=",3) # ranking
105
+ dir = args.str("dir=","b") # 方向
106
+ directed= args.bool("-directed") # directed graph
107
+ udout = args.bool("-udout") # 無向グラフ出力
108
+
109
+ unless ["b","m","x"].index(dir)
110
+ MCMD::errorLog("dir= takes b, m, x")
111
+ raise ArgumentError
112
+ end
113
+
114
+ eo = args.file("eo=", "w")
115
+ no = args.file("no=", "w")
116
+ logFile = args.file("log=", "w")
117
+
118
+ # ============
119
+ # entry point
120
+
121
+ wf=MCMD::Mtemp.new
122
+ xxpal =wf.file
123
+ xxa=wf.file
124
+ xxb=wf.file
125
+ xxc=wf.file
126
+ xxd=wf.file
127
+ xxout=wf.file
128
+
129
+ # n1,n2,sim
130
+ # a,b,0.40
131
+ # a,c,0.31
132
+ # a,d,0.22
133
+ # b,c,0.20
134
+ # b,d,0.24
135
+ # b,e,0.14
136
+ # c,d,0.30
137
+ # d,e,0.09
138
+ if directed
139
+ # 任意の枝a->bのaについて上位rankを選択
140
+ f=""
141
+ f << "mnumber k=#{ef1} s=#{sim}%nr e=skip S=1 a=##rank i=#{ei} |"
142
+ f << "mselnum f=##rank c='[,#{rank}]' o=#{xxpal}"
143
+ system(f)
144
+ else
145
+ # 有向グラフにしてrankを計算
146
+ system "mfsort f=#{ef1},#{ef2} i=#{ei} o=#{xxa}"
147
+ system "mfsort f=#{ef2},#{ef1} i=#{ei} o=#{xxb}"
148
+ f=""
149
+ f << "mcat i=#{xxa},#{xxb} |"
150
+ f << "muniq k=#{ef1},#{ef2} |"
151
+ f << "mnumber k=#{ef1} s=#{sim}%nr e=skip S=1 a=##rank |"
152
+ f << "mselnum f=##rank c='[,#{rank}]' o=#{xxpal}"
153
+ system(f)
154
+ end
155
+
156
+ # 両方向+片方向
157
+ if dir=="x"
158
+ f=""
159
+ f << "mcut f=#{ef1},#{ef2},#{sim} i=#{xxpal} o=#{xxout}"
160
+ system(f)
161
+
162
+ # 両方向
163
+ elsif dir=="b"
164
+ # 得られた上位rankグラフからa->b->cを作成し、a==cであれば相思相愛ということ
165
+ f=""
166
+ f << "mnjoin k=#{ef2} K=#{ef1} m=#{xxpal} f=#{ef2}:##ef2,#{sim}:sim2 i=#{xxpal} |"
167
+ f << "msel c='$s{#{ef1}}==$s{##ef2}' |"
168
+ f << "mcut f=#{ef1},#{ef2},#{sim} o=#{xxout}"
169
+ system(f)
170
+
171
+ # 片方向
172
+ else
173
+ # 得られた上位rankグラフからa->b->cを作成し、a==cであれば相思相愛ということ
174
+ f=""
175
+ f << "mnjoin k=#{ef2} K=#{ef1} m=#{xxpal} f=#{ef2}:##ef2,#{sim}:sim2 i=#{xxpal} |"
176
+ f << "msel c='$s{#{ef1}}==$s{##ef2}' |"
177
+ f << "mcut f=#{ef1},#{ef2} o=#{xxc}"
178
+ system(f)
179
+
180
+ f=""
181
+ f << "mcut f=#{ef1},#{ef2},#{sim} i=#{xxpal} |"
182
+ f << "mcommon k=#{ef1},#{ef2} m=#{xxc} -r o=#{xxout}"
183
+ system(f)
184
+ end
185
+
186
+ if udout
187
+ f=""
188
+ f << "mfsort f=#{ef1},#{ef2} i=#{xxout} |"
189
+ f << "mavg k=#{ef1},#{ef2} f=#{sim} |"
190
+ f << "msortf f=#{ef1},#{ef2} o=#{eo}"
191
+ system(f)
192
+ else
193
+ system "msortf f=#{ef1},#{ef2} i=#{xxout} o=#{eo}"
194
+ end
195
+
196
+ if ni and no
197
+ system "cp #{ni} #{no}"
198
+ end
199
+
200
+ # 終了メッセージ
201
+ MCMD::endLog(args.cmdline)
202
+
data/bin/mgdiff.rb ADDED
@@ -0,0 +1,252 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require "rubygems"
5
+ require "nysol/mcmd"
6
+
7
+ # ver="1.0" # 初期リリース 2014/2/20
8
+ # ver="1.1" # 節点ファイル対応 2014/8/2
9
+ $cmd=$0.sub(/.*\//,"")
10
+ $version="1.1"
11
+
12
+ def help
13
+ STDERR.puts <<EOF
14
+ ----------------------------
15
+ #{$cmd} version #{$version}
16
+ ----------------------------
17
+ 概要) 2つのグラフを比較し、同じ枝と異なる枝の情報を出力する。
18
+ 書式) #{$cmd} ei= [ef=] eI= [eF=] [eo=] [no=] [T=] [--help]
19
+
20
+ ファイル名指定
21
+ ei= : 入力枝ファイル1
22
+ ef= : 枝を構成するの2つの節点項目名(ei=上の項目名,デフォルト:node1,node2)
23
+ eI= : 入力枝ファイル2
24
+ eF= : eI=上の2つの節点項目名(ef=と同じであれば省略できる,デフォルト:ef=で指定した項目名)
25
+
26
+ ni= : 入力節点ファイル1(ei=に対応)
27
+ nf= : 枝を構成するの2つの節点項目名(ni=上の項目名,デフォルト:node)
28
+ nI= : 入力節点ファイル2(eI=に対応)
29
+ nF= : nI=上の2つの節点項目名(nf=と同じであれば省略できる,デフォルト:nf=で指定した項目名)
30
+
31
+ eo= : 出力枝ファイル
32
+ no= : 出力節点ファイル
33
+
34
+ -dir : 有向グラフとして扱う
35
+
36
+ その他
37
+ T= : ワークディレクトリ(default:/tmp)
38
+ --help : ヘルプの表示
39
+
40
+ 注1) 無向グラフとして扱う場合(デフォルト)、ei=ファイルとeI=ファイルとで、
41
+ 節点の並びが異なっていても、それは同じと見なす(ex. 枝a,bと枝b,aは同じ)。
42
+ -dirを指定すれば異なるものと見なす。
43
+ 注2) 無向グラフとして扱う場合(デフォルト)、
44
+ 処理効率を重視し、ef=で指定した節点の並びはアルファベット順に並べ替えるため、
45
+ eo=の項目の並びがei=やeI=の並びと異なることがある。
46
+ 注3) 同じ枝が複数ある場合、それらは単一化される。
47
+
48
+ 入力データ)
49
+ ei=,eI=: 節点ペアからなるCSVファイル。
50
+ ni=,nI=: 節点からなるCSVファイル。
51
+
52
+ 枝出力データ)
53
+ 枝ファイル1と枝ファイル2のいずれかに出現する枝(節点ペア)について以下の値を出力する。
54
+ 項目名: 内容
55
+ ei : ei=で指定したグラフにその行の節点ペアがあれば、そのファイル名
56
+ eI : eI=で指定したグラフにその行の節点ペアがあれば、そのファイル名
57
+ diff : 差分の区分
58
+ 1: ei=のグラフにしか存在しない
59
+ 0: ei=,eI=の両方に存在する
60
+ -1: eI=のグラフにしか存在しない
61
+
62
+ 節点出力データ)
63
+ 節点ファイル1と節点ファイル2のいずれかに出現する節点について以下の値を出力する。
64
+ 項目名: 内容
65
+ ni : ni=で指定したグラフにその節点があれば、そのファイル名
66
+ nI : nI=で指定したグラフにその節点があれば、そのファイル名
67
+ diff : 差分の区分
68
+ 1: ni=のグラフにしか存在しない
69
+ 0: ni=,nI=の両方に存在する
70
+ -1: nI=のグラフにしか存在しない
71
+
72
+
73
+ 例)
74
+ $ cat g1.csv
75
+ node1,node2
76
+ a,b
77
+ b,c
78
+ c,d
79
+
80
+ $ cat g2.csv
81
+ node1,node2
82
+ b,a
83
+ c,d
84
+ d,e
85
+
86
+ $ mgdiff.rb ei=g1.csv eI=g2.csv ef=node1,node2
87
+ node1,node2,i,I,diff
88
+ a,b,g1.csv,g2.csv,0
89
+ b,c,g1.csv,,1
90
+ c,d,g1.csv,g2.csv,0
91
+ d,e,,g2.csv,-1
92
+
93
+ $ mgdiff.rb ei=g1.csv eI=g2.csv ef=node1,node2 -dir
94
+ node1,node2,i,I,diff
95
+ a,b,data/g1.csv,,1
96
+ b,a,,data/g2.csv,-1
97
+ b,c,data/g1.csv,,1
98
+ c,d,data/g1.csv,data/g2.csv,0
99
+ d,e,,data/g2.csv,-1
100
+
101
+ # Copyright(c) NYSOL 2012- All Rights Reserved.
102
+ EOF
103
+ exit
104
+ end
105
+
106
+ def ver()
107
+ STDERR.puts "version #{$version}"
108
+ exit
109
+ end
110
+
111
+ help() if ARGV[0]=="--help" or ARGV.size <= 0
112
+ ver() if ARGV[0]=="--version"
113
+ args=MCMD::Margs.new(ARGV,"ei=,ef=,eI=,eF=,ni=,nf=,nI=,nF=,-dir,eo=,no=,T=","ei=,eI=,eo=")
114
+
115
+ # mcmdのメッセージは警告とエラーのみ
116
+ ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
117
+
118
+ #ワークファイルパス
119
+ if args.str("T=")!=nil then
120
+ ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
121
+ end
122
+
123
+ ei = args.file("ei=","r")
124
+ eI = args.file("eI=","r")
125
+ ni = args.file("ni=","r")
126
+ nI = args.file("nI=","r")
127
+ eo = args.file("eo=","w")
128
+ no = args.file("no=","w")
129
+
130
+ if (ni and not nI) or (not ni and nI)
131
+ raise("must specify both of ni= and nI=")
132
+ end
133
+
134
+ ## ef=: cliqueファイルedge始点終了頂点項目名
135
+ ef1,ef2 = args.field("ef=", ei,"node1,node2",2,2)["names"]
136
+
137
+ ## ev=: weights on input file
138
+ #ev = args.field("ev=", ei)
139
+ #ev = ev["names"].join(",") if ev
140
+
141
+ ## eF=: 参照ファイルedge始点終了頂点項目名
142
+ eF = args.field("eF=", eI, nil, 2,2)
143
+ eF1,eF2=eF["names"] if eF
144
+ eF1=ef1 unless eF1
145
+ eF2=ef2 unless eF2
146
+
147
+ # ---- node field name on ni=
148
+ nf = args.field("nf=", ni, "node",1,1)
149
+ nf = nf["names"][0] if nf
150
+
151
+ ## eF=: 参照ファイルedge始点終了頂点項目名
152
+ nF = args.field("nF=", nI, nil, 1,1)
153
+ nF = nF["names"] if nF
154
+ nF =nf unless eF
155
+
156
+ ## eV=: weights on reference file
157
+ #eV = args.field("eV=", eI)
158
+ #eV = eV["names"].join(",") if eV
159
+ #eV=ev unless eV
160
+
161
+ # -dir: compare as a derected graph
162
+ dir=args.bool("-dir")
163
+
164
+ wf=MCMD::Mtemp.new
165
+ xxedge_i=wf.file
166
+ xxedge_I=wf.file
167
+
168
+ # ei=のサンプル
169
+ # id,node1,node2,size
170
+ # 0,e,f,2
171
+ # 1,b,f,2
172
+ # 2,a,c,4
173
+ # 2,a,d,4
174
+ # 2,a,e,4
175
+ # 2,c,d,4
176
+ # 2,c,e,4
177
+ # 2,d,e,4
178
+ # 3,a,b,4
179
+ # 3,a,c,4
180
+ # 3,a,d,4
181
+ # 3,b,c,4
182
+ # 3,b,d,4
183
+ # 3,c,d,4
184
+ #
185
+ # eI=のサンプル
186
+ # node1,node2
187
+ # a,b
188
+ # a,c
189
+ # a,d
190
+ # a,e
191
+ # b,c
192
+ # b,d
193
+ # b,f
194
+ # c,d
195
+ # c,e
196
+ # d,e
197
+ # e,f
198
+
199
+ # クリーニング(ei=)
200
+ f=""
201
+ f << "mcut f=#{ef1},#{ef2} i=#{ei} |"
202
+ f << "mfsort f=#{ef1},#{ef2} |" unless dir
203
+ f << "msortf f=#{ef1},#{ef2} |"
204
+ f << "muniq k=#{ef1},#{ef2} |"
205
+ f << "msetstr v=#{ei} a=ei o=#{xxedge_i}"
206
+ system(f)
207
+
208
+ # クリーニング(eI=)
209
+ f=""
210
+ f << "mcut f=#{eF1}:#{ef1},#{eF2}:#{ef2} i=#{eI} |"
211
+ f << "mfsort f=#{ef1},#{ef2} |" unless dir
212
+ f << "msortf f=#{ef1},#{ef2} |"
213
+ f << "muniq k=#{ef1},#{ef2} |"
214
+ f << "msetstr v=#{eI} a=eI o=#{xxedge_I}"
215
+ system(f)
216
+
217
+ f=""
218
+ f << "mjoin k=#{ef1},#{ef2} m=#{xxedge_I} f=eI i=#{xxedge_i} -n -N |"
219
+ f << "mcal c='if(isnull($s{ei}),-1,if(isnull($s{eI}),1,0))' a=diff |"
220
+ f << "mcut f=#{ef1},#{ef2},ei,eI,diff o=#{eo}"
221
+ system(f)
222
+
223
+ if ni and nI then
224
+ xxnode_i=wf.file
225
+ xxnode_I=wf.file
226
+
227
+ # クリーニング(ni=)
228
+ f=""
229
+ f << "mcut f=#{nf} i=#{ni} |"
230
+ f << "msortf f=#{nf} |"
231
+ f << "muniq k=#{nf} |"
232
+ f << "msetstr v=#{ni} a=ni o=#{xxnode_i}"
233
+ system(f)
234
+
235
+ # クリーニング(nI=)
236
+ f=""
237
+ f << "mcut f=#{nF}:#{nf} i=#{nI} |"
238
+ f << "msortf f=#{nf} |"
239
+ f << "muniq k=#{nf} |"
240
+ f << "msetstr v=#{nI} a=nI o=#{xxnode_I}"
241
+ system(f)
242
+
243
+ f=""
244
+ f << "mjoin k=#{nf} m=#{xxnode_I} f=nI i=#{xxnode_i} -n -N |"
245
+ f << "mcal c='if(isnull($s{ni}),-1,if(isnull($s{nI}),1,0))' a=diff |"
246
+ f << "mcut f=#{nf},ni,nI,diff o=#{no}"
247
+ system(f)
248
+ end
249
+
250
+ # 終了メッセージ
251
+ MCMD::endLog(args.cmdline)
252
+