nysol-view 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/m2gv.rb +812 -0
- data/bin/mautocolor.rb +244 -0
- data/bin/mbar.rb +818 -0
- data/bin/mdtree.rb +1017 -0
- data/bin/mgv.rb +809 -0
- data/bin/mnest2tree.rb +159 -0
- data/bin/mpie.rb +733 -0
- data/bin/msankey.rb +644 -0
- data/lib/nysol/viewjs.rb +13490 -0
- metadata +101 -0
data/bin/mnest2tree.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#-*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "nysol/mcmd"
|
6
|
+
require "set"
|
7
|
+
|
8
|
+
# ver="1.0" # 初期リリース 2016/11/09
|
9
|
+
$cmd=$0.sub(/.*\//,"")
|
10
|
+
|
11
|
+
$version=1.0
|
12
|
+
$revision="###VERSION###"
|
13
|
+
|
14
|
+
def help
|
15
|
+
|
16
|
+
STDERR.puts <<EOF
|
17
|
+
------------------------
|
18
|
+
#{$cmd} version #{$version}
|
19
|
+
------------------------
|
20
|
+
概要) 入れ子グラフ(nested graph)をtree構造グラフに変換する
|
21
|
+
|
22
|
+
書式1) #{$cmd} k= [ni=] [nf=] ei= ef= [no=] [eo=]
|
23
|
+
|
24
|
+
k= : 入れ子グラフのクラスタ項目名(ni=を指定した場合は同じ項目名でなければならない)
|
25
|
+
複数項目指定不可
|
26
|
+
|
27
|
+
ni= : 頂点集合ファイル名
|
28
|
+
nf= : 頂点ID項目名
|
29
|
+
|
30
|
+
ei= : 枝集合ファイル名
|
31
|
+
ef= : 開始頂点ID項目名,終了頂点ID項目名
|
32
|
+
ev= : 枝重み
|
33
|
+
|
34
|
+
no= : 出力節点ファイル名
|
35
|
+
eo= : 出力枝ファイル名
|
36
|
+
|
37
|
+
-h,--help : ヘルプの表示
|
38
|
+
|
39
|
+
基本例)
|
40
|
+
EOF
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
def ver()
|
44
|
+
$revision ="0" if $revision =~ /VERSION/
|
45
|
+
STDERR.puts "version #{$version} revision #{$revision}"
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
help() if ARGV.size <= 0 or ARGV[0]=="--help"
|
50
|
+
ver() if ARGV[0]=="--version"
|
51
|
+
|
52
|
+
# ===================================================================
|
53
|
+
# パラメータ処理
|
54
|
+
args=MCMD::Margs.new(ARGV,"k=,ni=,nf=,ei=,ef=,ev=,no=,eo=","ei=,ef=")
|
55
|
+
|
56
|
+
# mcmdのメッセージは警告とエラーのみ
|
57
|
+
ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
|
58
|
+
|
59
|
+
ni = args. file("ni=","r") # nodeファイル名
|
60
|
+
nf = args.field("nf=", ni) # nodeID項目名
|
61
|
+
unless args.keyValue["ni="]
|
62
|
+
if args.keyValue["nf="]
|
63
|
+
raise "nf= cannot be specified without ni="
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
if args.keyValue["ni="]
|
68
|
+
#unless args.keyValue["nf="] or args.keyValue["nv="]
|
69
|
+
unless args.keyValue["nf="]
|
70
|
+
raise "nf= must be specified when ni= is given"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
ei = args. file("ei=","r") # edgeファイル名
|
75
|
+
key= args.field("k=", ei,nil,1,1) # nested graph クラスタ項目
|
76
|
+
key=key["names"][0] if key
|
77
|
+
ef = args.field("ef=", ei) # edge始点node項目名,終了頂点項目名
|
78
|
+
ev = args.field("ev=", ei) # edge value項目名
|
79
|
+
ef1=ef["names"][0]
|
80
|
+
ef2=ef["names"][1]
|
81
|
+
if ef1==nil or ef2==nil then
|
82
|
+
raise "ef= takes two field names"
|
83
|
+
end
|
84
|
+
|
85
|
+
if ni
|
86
|
+
nf=nf["names"][0]
|
87
|
+
end
|
88
|
+
ev=ev["names"][0] if ev
|
89
|
+
|
90
|
+
noFile = args.file("no=","w") # 出力ファイル名
|
91
|
+
eoFile = args.file("eo=","w") # 出力ファイル名
|
92
|
+
|
93
|
+
#############
|
94
|
+
# entry point
|
95
|
+
temp=MCMD::Mtemp.new
|
96
|
+
xxa=temp.file
|
97
|
+
xxb=temp.file
|
98
|
+
xxnewNode=temp.file
|
99
|
+
system "mcut f=#{key}:#orgKey,#{ef1}:#orgEf1,#{ef2}:#orgEf2 i=#{ei} o=#{xxa}"
|
100
|
+
|
101
|
+
MCMD::Mcsvout.new("f=#orgKey,#orgEf1,#orgEf2,#ef1,#ef2 o=#{xxb}"){|oCSV|
|
102
|
+
iCSV=MCMD::Mcsvin.new("i=#{xxa}")
|
103
|
+
iCSV.each{|flds|
|
104
|
+
orgKey =flds["#orgKey"]
|
105
|
+
orgEf1 =flds["#orgEf1"]
|
106
|
+
orgEf2 =flds["#orgEf2"]
|
107
|
+
# エッジを外して、親(key)との接続に変更する
|
108
|
+
# 新しいkeyはnullとする
|
109
|
+
oCSV.write([orgKey,orgEf1,orgEf2,orgKey,orgEf1])
|
110
|
+
oCSV.write([orgKey,orgEf1,orgEf2,orgKey,orgEf2])
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
# evが指定されているときは、平均重みを新しいedge(親-子)の重みとする
|
115
|
+
f=""
|
116
|
+
f << "mjoin k=#orgKey,#orgEf1,#orgEf2 K=#{key},#{ef1},#{ef2} m=#{ei} i=#{xxb} |" # 全項目join
|
117
|
+
if ev
|
118
|
+
f << "mavg k=#ef1,#ef2 f=#{ev} |"
|
119
|
+
else
|
120
|
+
f << "muniq k=#ef1,#ef2 |"
|
121
|
+
end
|
122
|
+
f << "mcut -r f=#orgKey,#orgEf1,#orgEf2 |"
|
123
|
+
f << "mfldname f=#ef1:#{ef1},#ef2:#{ef2} o=#{eoFile}"
|
124
|
+
system(f)
|
125
|
+
|
126
|
+
# 新たにclusterがnode名に登録されている可能性があるので、そのノードを取得し、後にnodeファイルに追加しておく
|
127
|
+
if ni
|
128
|
+
fldNames=nil
|
129
|
+
MCMD::Mcsvin.new("i=#{ni}"){|iCSV|
|
130
|
+
fldNames=iCSV.names
|
131
|
+
fldNames.delete(nf)
|
132
|
+
}
|
133
|
+
commas=','*(fldNames.size-1)
|
134
|
+
#p fldNames.join(',')
|
135
|
+
|
136
|
+
f=""
|
137
|
+
f << "mcut f=#{ef1}:#{nf} i=#{eoFile} |"
|
138
|
+
f << "muniq k=#{nf} |"
|
139
|
+
f << "mcommon k=#{nf} m=#{ni} -r |"
|
140
|
+
f << "msetstr v=#{commas} a=#{fldNames.join(',')} o=#{xxnewNode}"
|
141
|
+
system(f)
|
142
|
+
#system "cat #{xxnewNode}"
|
143
|
+
#exit
|
144
|
+
# system "cat #{niFile}"
|
145
|
+
# key,nam,keyNum%0,num,nv,nvv,nc,leaf,nvKey,ncKey
|
146
|
+
# #1_1,a,1,5,0.4666666667,3.222222223,,1,0.6666666667,
|
147
|
+
# #1_1,b,1,6,0.4,2.666666666,,1,0.6666666667,
|
148
|
+
f=""
|
149
|
+
f << "mcat i=#{ni},#{xxnewNode} |"
|
150
|
+
f << "mcut f=#{key} -r |"
|
151
|
+
f << "msetstr v= a=#{key} o=#{noFile}"
|
152
|
+
system(f)
|
153
|
+
#system "cat #{noFile}"
|
154
|
+
#exit
|
155
|
+
end
|
156
|
+
|
157
|
+
# 終了メッセージ
|
158
|
+
MCMD::endLog(args.cmdline)
|
159
|
+
|