nysol-take 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/mbiclique.rb +317 -0
- data/bin/mbipolish.rb +362 -0
- data/bin/mccomp.rb +235 -0
- data/bin/mclique.rb +295 -0
- data/bin/mclique2g.rb +105 -0
- data/bin/mcliqueInfo.rb +203 -0
- data/bin/mfriends.rb +202 -0
- data/bin/mgdiff.rb +252 -0
- data/bin/mhifriend.rb +456 -0
- data/bin/mhipolish.rb +465 -0
- data/bin/mitemset.rb +168 -0
- data/bin/mpal.rb +410 -0
- data/bin/mpolishing.rb +399 -0
- data/bin/msequence.rb +165 -0
- data/bin/mtra2g.rb +476 -0
- data/bin/mtra2gc.rb +360 -0
- data/ext/grhfilrun/extconf.rb +12 -0
- data/ext/grhfilrun/grhfilrun.c +85 -0
- data/ext/grhfilrun/src/_sspc.c +358 -0
- data/ext/grhfilrun/src/aheap.c +545 -0
- data/ext/grhfilrun/src/aheap.h +251 -0
- data/ext/grhfilrun/src/base.c +92 -0
- data/ext/grhfilrun/src/base.h +59 -0
- data/ext/grhfilrun/src/fstar.c +497 -0
- data/ext/grhfilrun/src/fstar.h +80 -0
- data/ext/grhfilrun/src/grhfil.c +214 -0
- data/ext/grhfilrun/src/itemset.c +713 -0
- data/ext/grhfilrun/src/itemset.h +170 -0
- data/ext/grhfilrun/src/problem.c +415 -0
- data/ext/grhfilrun/src/problem.h +179 -0
- data/ext/grhfilrun/src/queue.c +533 -0
- data/ext/grhfilrun/src/queue.h +182 -0
- data/ext/grhfilrun/src/sample.c +19 -0
- data/ext/grhfilrun/src/sspc.c +597 -0
- data/ext/grhfilrun/src/sspc2.c +491 -0
- data/ext/grhfilrun/src/stdlib2.c +1482 -0
- data/ext/grhfilrun/src/stdlib2.h +892 -0
- data/ext/grhfilrun/src/trsact.c +817 -0
- data/ext/grhfilrun/src/trsact.h +160 -0
- data/ext/grhfilrun/src/vec.c +745 -0
- data/ext/grhfilrun/src/vec.h +172 -0
- data/ext/lcmrun/extconf.rb +20 -0
- data/ext/lcmrun/lcmrun.cpp +99 -0
- data/ext/lcmrun/src/aheap.c +216 -0
- data/ext/lcmrun/src/aheap.h +111 -0
- data/ext/lcmrun/src/base.c +92 -0
- data/ext/lcmrun/src/base.h +59 -0
- data/ext/lcmrun/src/itemset.c +496 -0
- data/ext/lcmrun/src/itemset.h +157 -0
- data/ext/lcmrun/src/lcm.c +427 -0
- data/ext/lcmrun/src/problem.c +349 -0
- data/ext/lcmrun/src/problem.h +177 -0
- data/ext/lcmrun/src/queue.c +528 -0
- data/ext/lcmrun/src/queue.h +176 -0
- data/ext/lcmrun/src/sgraph.c +359 -0
- data/ext/lcmrun/src/sgraph.h +173 -0
- data/ext/lcmrun/src/stdlib2.c +1282 -0
- data/ext/lcmrun/src/stdlib2.h +823 -0
- data/ext/lcmrun/src/trsact.c +747 -0
- data/ext/lcmrun/src/trsact.h +159 -0
- data/ext/lcmrun/src/vec.c +731 -0
- data/ext/lcmrun/src/vec.h +171 -0
- data/ext/lcmseq0run/extconf.rb +20 -0
- data/ext/lcmseq0run/lcmseq0run.cpp +59 -0
- data/ext/lcmseq0run/src/aheap.c +216 -0
- data/ext/lcmseq0run/src/aheap.h +111 -0
- data/ext/lcmseq0run/src/base.c +92 -0
- data/ext/lcmseq0run/src/base.h +59 -0
- data/ext/lcmseq0run/src/itemset.c +518 -0
- data/ext/lcmseq0run/src/itemset.h +157 -0
- data/ext/lcmseq0run/src/itemset_zero.c +522 -0
- data/ext/lcmseq0run/src/lcm_seq.c +446 -0
- data/ext/lcmseq0run/src/lcm_seq_zero.c +446 -0
- data/ext/lcmseq0run/src/problem.c +439 -0
- data/ext/lcmseq0run/src/problem.h +179 -0
- data/ext/lcmseq0run/src/problem_zero.c +439 -0
- data/ext/lcmseq0run/src/queue.c +533 -0
- data/ext/lcmseq0run/src/queue.h +182 -0
- data/ext/lcmseq0run/src/stdlib2.c +1350 -0
- data/ext/lcmseq0run/src/stdlib2.h +864 -0
- data/ext/lcmseq0run/src/trsact.c +747 -0
- data/ext/lcmseq0run/src/trsact.h +159 -0
- data/ext/lcmseq0run/src/vec.c +779 -0
- data/ext/lcmseq0run/src/vec.h +172 -0
- data/ext/lcmseqrun/extconf.rb +20 -0
- data/ext/lcmseqrun/lcmseqrun.cpp +101 -0
- data/ext/lcmseqrun/src/aheap.c +216 -0
- data/ext/lcmseqrun/src/aheap.h +111 -0
- data/ext/lcmseqrun/src/base.c +92 -0
- data/ext/lcmseqrun/src/base.h +59 -0
- data/ext/lcmseqrun/src/itemset.c +518 -0
- data/ext/lcmseqrun/src/itemset.h +157 -0
- data/ext/lcmseqrun/src/itemset_zero.c +522 -0
- data/ext/lcmseqrun/src/lcm_seq.c +447 -0
- data/ext/lcmseqrun/src/lcm_seq_zero.c +446 -0
- data/ext/lcmseqrun/src/problem.c +439 -0
- data/ext/lcmseqrun/src/problem.h +179 -0
- data/ext/lcmseqrun/src/problem_zero.c +439 -0
- data/ext/lcmseqrun/src/queue.c +533 -0
- data/ext/lcmseqrun/src/queue.h +182 -0
- data/ext/lcmseqrun/src/stdlib2.c +1350 -0
- data/ext/lcmseqrun/src/stdlib2.h +864 -0
- data/ext/lcmseqrun/src/trsact.c +747 -0
- data/ext/lcmseqrun/src/trsact.h +159 -0
- data/ext/lcmseqrun/src/vec.c +779 -0
- data/ext/lcmseqrun/src/vec.h +172 -0
- data/ext/lcmtransrun/extconf.rb +18 -0
- data/ext/lcmtransrun/lcmtransrun.cpp +264 -0
- data/ext/macerun/extconf.rb +20 -0
- data/ext/macerun/macerun.cpp +57 -0
- data/ext/macerun/src/aheap.c +217 -0
- data/ext/macerun/src/aheap.h +112 -0
- data/ext/macerun/src/itemset.c +491 -0
- data/ext/macerun/src/itemset.h +158 -0
- data/ext/macerun/src/mace.c +503 -0
- data/ext/macerun/src/problem.c +346 -0
- data/ext/macerun/src/problem.h +174 -0
- data/ext/macerun/src/queue.c +529 -0
- data/ext/macerun/src/queue.h +177 -0
- data/ext/macerun/src/sgraph.c +360 -0
- data/ext/macerun/src/sgraph.h +174 -0
- data/ext/macerun/src/stdlib2.c +993 -0
- data/ext/macerun/src/stdlib2.h +811 -0
- data/ext/macerun/src/vec.c +634 -0
- data/ext/macerun/src/vec.h +170 -0
- data/ext/sspcrun/extconf.rb +20 -0
- data/ext/sspcrun/src/_sspc.c +358 -0
- data/ext/sspcrun/src/aheap.c +545 -0
- data/ext/sspcrun/src/aheap.h +251 -0
- data/ext/sspcrun/src/base.c +92 -0
- data/ext/sspcrun/src/base.h +59 -0
- data/ext/sspcrun/src/fstar.c +496 -0
- data/ext/sspcrun/src/fstar.h +80 -0
- data/ext/sspcrun/src/grhfil.c +213 -0
- data/ext/sspcrun/src/itemset.c +713 -0
- data/ext/sspcrun/src/itemset.h +170 -0
- data/ext/sspcrun/src/problem.c +415 -0
- data/ext/sspcrun/src/problem.h +179 -0
- data/ext/sspcrun/src/queue.c +533 -0
- data/ext/sspcrun/src/queue.h +182 -0
- data/ext/sspcrun/src/sample.c +19 -0
- data/ext/sspcrun/src/sspc.c +598 -0
- data/ext/sspcrun/src/sspc2.c +491 -0
- data/ext/sspcrun/src/stdlib2.c +1482 -0
- data/ext/sspcrun/src/stdlib2.h +892 -0
- data/ext/sspcrun/src/trsact.c +817 -0
- data/ext/sspcrun/src/trsact.h +160 -0
- data/ext/sspcrun/src/vec.c +745 -0
- data/ext/sspcrun/src/vec.h +172 -0
- data/ext/sspcrun/sspcrun.cpp +54 -0
- data/lib/nysol/enumLcmEp.rb +338 -0
- data/lib/nysol/enumLcmEsp.rb +284 -0
- data/lib/nysol/enumLcmIs.rb +275 -0
- data/lib/nysol/enumLcmSeq.rb +143 -0
- data/lib/nysol/items.rb +201 -0
- data/lib/nysol/seqDB.rb +256 -0
- data/lib/nysol/take.rb +39 -0
- data/lib/nysol/taxonomy.rb +113 -0
- data/lib/nysol/traDB.rb +257 -0
- metadata +239 -0
data/bin/mcliqueInfo.rb
ADDED
@@ -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
|
+
|