nysol-view 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+