nysol-view 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+