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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e30036a31f3107df33aae6da18928c97c03ce52d
|
4
|
+
data.tar.gz: b2bc758258baffa71e8a76c75299e24458357d44
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e1d5c04b64285de5052506231838b388a83e5258b9d015e28beece15c7129e044aefc910ffe80ec9b09c98462077e331aa36ac9dcd437c1b86e7ecf21fbda861
|
7
|
+
data.tar.gz: 3bb9949747aa25c85c272347bf3d84ab1d25f03b8410ba5417d97e9e288e7eb3d35eabc550ece20182e6e3dd9e51e81286d9c55b01751b12cb90c74a18d1801d
|
data/bin/mbiclique.rb
ADDED
@@ -0,0 +1,317 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "nysol/mcmd"
|
6
|
+
require "nysol/take"
|
7
|
+
require "nysol/enumLcmIs"
|
8
|
+
|
9
|
+
# ver="1.0" # 初期リリース 2014/8/2
|
10
|
+
# ver="1.1" # アイテムの数値ソートに関するバグ修正 2015/9/8
|
11
|
+
# ver="1.2" # null値が含まれる場合にmappingテーブルがずれるバグ修正 2015/10/1
|
12
|
+
$cmd=File.basename($0)
|
13
|
+
$version="1.2"
|
14
|
+
|
15
|
+
def help
|
16
|
+
|
17
|
+
STDERR.puts <<EOF
|
18
|
+
----------------------------
|
19
|
+
mbiclique.rb version #{$version}
|
20
|
+
----------------------------
|
21
|
+
概要) lcmによる極大二部クリークの列挙
|
22
|
+
内容) 二部グラフデータを入力として、極大二部クリークを列挙する。
|
23
|
+
書式) mbiclique.rb ei= [ef=] [o=] [l=] [u=] [o=] [-edge] [T=] [-debug] [--help]
|
24
|
+
|
25
|
+
ファイル名指定
|
26
|
+
ei= : 辺データファイル
|
27
|
+
ef= : 辺データ上の2つの部項目名(省略時は"node1,node2")
|
28
|
+
o= : 出力ファイル
|
29
|
+
l= : 二部クリークを構成する最小節点数(ここで指定したサイズより小さいクリークは列挙されない)
|
30
|
+
: カンマで区切って2つの値を指定すると、各部のサイズを制限できる
|
31
|
+
: 1つ目の値はef=で指定した1つ目の部に対応し、2つ目の値は2つ目に指定した部に対応する。
|
32
|
+
u= : クリークを構成する最大節点数(ここで指定したサイズより大きいクリークは列挙されない)
|
33
|
+
: カンマで区切って2つの値を指定すると、各部のサイズを制限できる
|
34
|
+
-edge : 枝による出力(クリークIDと枝(節点ペア)で出力する)
|
35
|
+
|
36
|
+
その他
|
37
|
+
T= : ワークディレクトリ(default:/tmp)
|
38
|
+
--help : ヘルプの表示
|
39
|
+
|
40
|
+
入力形式)
|
41
|
+
二部グラフの節点ペアを項目で表現したCSVデータ。
|
42
|
+
|
43
|
+
出力形式1)
|
44
|
+
二部クリークを構成する全節点を各部ごとにベクトル形式で出力する。
|
45
|
+
出力項目は、"節点項目名1,節点項目名2,size1,size2"の4項目で、節点名1と節点名2は、ef=で指定された名称が利用される。
|
46
|
+
節点項目名1,節点項目名2に出力される値が節点名ベクトルである(一行が一つの二部クリークに対応)ことが異なる。
|
47
|
+
idはクリークの識別番号で、一つのクリークは同じid番号が振られる。id番号そのものに意味はない。
|
48
|
+
節点項目名1,節点項目名2には、各部を構成する節点名のベクトルが出力される。
|
49
|
+
size1,size2は二部クリークを構成する各部の節点数である。
|
50
|
+
|
51
|
+
出力形式2) -edge を指定した場合の出力形式
|
52
|
+
クリークIDと二部クリークを構成する全枝(節点ペア)を出力する。
|
53
|
+
出力項目は"id,節点項目名1,節点項目名2,size"の4項目である。
|
54
|
+
例えば各部のサイズが3,4であるような二部クリークは12行の枝データとして出力される。
|
55
|
+
出力形式1に比べてファイルサイズは大きくなる。
|
56
|
+
|
57
|
+
|
58
|
+
例1)
|
59
|
+
$ cat data1.csv
|
60
|
+
node1,node2
|
61
|
+
a,A
|
62
|
+
a,B
|
63
|
+
a,C
|
64
|
+
b,A
|
65
|
+
b,B
|
66
|
+
b,D
|
67
|
+
c,A
|
68
|
+
c,D
|
69
|
+
d,B
|
70
|
+
d,C
|
71
|
+
d,D
|
72
|
+
|
73
|
+
$ mclique.rb ei=data1.csv ef=n1,n2 o=out1.csv
|
74
|
+
#MSG# converting paired form into transaction form ...; 2014/03/24 11:52:05
|
75
|
+
#MSG# lcm_20140215 CIf /tmp/__MTEMP_47150_70177387663280_0 1 /tmp/__MTEMP_47150_70177387663280_3; 2014/03/24 11:52:05
|
76
|
+
trsact: /tmp/__MTEMP_47150_70177387663280_0 ,#transactions 4 ,#items 4 ,size 11 extracted database: #transactions 4 ,#items 4 ,size 11
|
77
|
+
output to: /tmp/__MTEMP_47150_70177387663280_3
|
78
|
+
separated at 0
|
79
|
+
11
|
80
|
+
1
|
81
|
+
3
|
82
|
+
4
|
83
|
+
3
|
84
|
+
iters=11
|
85
|
+
#END# mbiclique.rb ei=data1.csv o=out1.csv ef=node1,node2
|
86
|
+
$ cat out1.csv
|
87
|
+
node1,node2,size1,size2
|
88
|
+
a,A B C,1,3
|
89
|
+
a b,A B,2,2
|
90
|
+
a b c,A,3,1
|
91
|
+
a b d,B,3,1
|
92
|
+
a d,B C,2,2
|
93
|
+
b,A B D,1,3
|
94
|
+
b c,A D,2,2
|
95
|
+
b c d,D,3,1
|
96
|
+
b d,B D,2,2
|
97
|
+
d,B C D,1,3
|
98
|
+
|
99
|
+
例3) 枝による出力(-edgeの指定)
|
100
|
+
$ mclique.rb ei=data1.csv ef=n1,n2 o=out2.csv
|
101
|
+
#END# ../../bin/mbiclique.rb ei=data/data1.csv o=xxresult/out11.csv ef=node1,node2 -edge
|
102
|
+
$ cat out2.csv
|
103
|
+
id,node1,node2,size1,size2
|
104
|
+
1,c,A,3,1
|
105
|
+
1,a,A,3,1
|
106
|
+
1,b,A,3,1
|
107
|
+
10,d,B,1,3
|
108
|
+
10,d,C,1,3
|
109
|
+
10,d,D,1,3
|
110
|
+
2,b,B,3,1
|
111
|
+
2,a,B,3,1
|
112
|
+
2,d,B,3,1
|
113
|
+
:
|
114
|
+
|
115
|
+
例3) 部node1の最小サイズを3に制限
|
116
|
+
$ mbiclique.rb ei=data1.csv o=out3.csv ef=node1,node2 l=3,
|
117
|
+
#END# mbiclique.rb ei=data1.csv o=out3.csv ef=node1,node2 l=3,
|
118
|
+
$ cat out3.csv
|
119
|
+
node1,node2,size1,size2
|
120
|
+
a b c,A,3,1
|
121
|
+
a b d,B,3,1
|
122
|
+
b c d,D,3,1
|
123
|
+
|
124
|
+
# Copyright(c) NYSOL 2012- All Rights Reserved.
|
125
|
+
EOF
|
126
|
+
exit
|
127
|
+
end
|
128
|
+
def ver()
|
129
|
+
STDERR.puts "version #{$version}"
|
130
|
+
exit
|
131
|
+
end
|
132
|
+
|
133
|
+
help() if ARGV.size <= 0 or ARGV[0]=="--help"
|
134
|
+
ver() if ARGV[0]=="--version"
|
135
|
+
args=MCMD::Margs.new(ARGV,"ei=,ef=,o=,l=,u=,-edge","ei=")
|
136
|
+
|
137
|
+
# コマンド実行可能確認
|
138
|
+
#exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD , "executable"))
|
139
|
+
|
140
|
+
# コマンド実行可能確認
|
141
|
+
#exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD, "executable"))
|
142
|
+
#exit(1) unless(MCMD::chkCmdExe(TAKE::LcmIs::CMD_TRANS, "-v", "lcm_trans 1.0"))
|
143
|
+
|
144
|
+
# mcmdのメッセージは警告とエラーのみ
|
145
|
+
ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
|
146
|
+
|
147
|
+
#ワークファイルパス
|
148
|
+
if args.str("T=")!=nil then
|
149
|
+
ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
|
150
|
+
end
|
151
|
+
|
152
|
+
type="C"
|
153
|
+
|
154
|
+
byedge = args.bool("-edge")
|
155
|
+
oFile = args.file("o=", "w")
|
156
|
+
ei = args. file("ei=","r") # edgeファイル名
|
157
|
+
ef1,ef2 = args.field("ef=", ei, "node1,node2",2,2)["names"]
|
158
|
+
|
159
|
+
minSizeStr = args.str("l=") # クリークサイズ下限
|
160
|
+
maxSizeStr = args.str("u=") # クリークサイズ上限
|
161
|
+
minSize1=nil
|
162
|
+
minSize2=nil
|
163
|
+
if minSizeStr then
|
164
|
+
minSizeStr=minSizeStr.split(",",-1)
|
165
|
+
if minSizeStr.size==1 then
|
166
|
+
minSize1=minSizeStr[0].to_i if minSizeStr[0]!=""
|
167
|
+
minSize2=minSizeStr[0].to_i if minSizeStr[0]!=""
|
168
|
+
else
|
169
|
+
minSize1=minSizeStr[0].to_i if minSizeStr[0]!=""
|
170
|
+
minSize2=minSizeStr[1].to_i if minSizeStr[1]!=""
|
171
|
+
end
|
172
|
+
end
|
173
|
+
if maxSizeStr then
|
174
|
+
maxSizeStr=maxSizeStr.split(",",-1)
|
175
|
+
if maxSizeStr.size==1 then
|
176
|
+
maxSize1=maxSizeStr[0].to_i if maxSizeStr[0]!=""
|
177
|
+
maxSize2=maxSizeStr[0].to_i if maxSizeStr[0]!=""
|
178
|
+
else
|
179
|
+
maxSize1=maxSizeStr[0].to_i if maxSizeStr[0]!=""
|
180
|
+
maxSize2=maxSizeStr[1].to_i if maxSizeStr[1]!=""
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def pair2tra(ei,ef1,ef2,traFile,mapFile1,mapFile2)
|
185
|
+
MCMD::msgLog("converting paired form into transaction form ...")
|
186
|
+
wf=MCMD::Mtemp.new
|
187
|
+
wf1=wf.file
|
188
|
+
wf2=wf.file
|
189
|
+
|
190
|
+
f=""
|
191
|
+
f << "mcut f=#{ef1}:node1 i=#{ei} |"
|
192
|
+
f << "mdelnull f=node1 |"
|
193
|
+
f << "msortf f=node1 |"
|
194
|
+
f << "muniq k=node1 |"
|
195
|
+
f << "mnumber s=node1 a=num1 o=#{mapFile1}"
|
196
|
+
system(f)
|
197
|
+
|
198
|
+
f=""
|
199
|
+
f << "mcut f=#{ef2}:node2 i=#{ei} |"
|
200
|
+
f << "mdelnull f=node2 |"
|
201
|
+
f << "msortf f=node2 |"
|
202
|
+
f << "muniq k=node2 |"
|
203
|
+
f << "mnumber s=node2 a=num2 o=#{mapFile2}"
|
204
|
+
system(f)
|
205
|
+
|
206
|
+
f=""
|
207
|
+
f << "mcut f=#{ef1}:node1,#{ef2}:node2 i=#{ei} |"
|
208
|
+
f << "msortf f=node1 |"
|
209
|
+
f << "mjoin k=node1 m=#{mapFile1} f=num1 |"
|
210
|
+
f << "msortf f=node2 |"
|
211
|
+
f << "mjoin k=node2 m=#{mapFile2} f=num2 |"
|
212
|
+
f << "mcut f=num1,num2 |"
|
213
|
+
f << "msortf f=num1,num2%n |"
|
214
|
+
f << "mtra k=num1 s=num2%n f=num2 |"
|
215
|
+
f << "msortf f=num1%n |"
|
216
|
+
f << "mcut f=num2 -nfno o=#{traFile}"
|
217
|
+
system(f)
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
wf=MCMD::Mtemp.new
|
222
|
+
xxtra=wf.file
|
223
|
+
xxmap1=wf.file
|
224
|
+
xxmap2=wf.file
|
225
|
+
pair2tra(ei,ef1,ef2,xxtra,xxmap1,xxmap2)
|
226
|
+
#system "cp #{xxtra} xxtra"
|
227
|
+
#system "cp #{xxmap1} xxmap1"
|
228
|
+
#system "cp #{xxmap2} xxmap2"
|
229
|
+
|
230
|
+
# 利用コマンドファイル名
|
231
|
+
#CMD="lcm_20140215"
|
232
|
+
#{TAKE::LcmIs::CMD}
|
233
|
+
|
234
|
+
run=""
|
235
|
+
run << "#{type}If"
|
236
|
+
run << " -l #{minSize2}" if minSize2 # パターンサイズ下限
|
237
|
+
run << " -u #{maxSize2}" if maxSize2 # パターンサイズ上限
|
238
|
+
|
239
|
+
# lcm出力ファイル
|
240
|
+
lcmout = wf.file
|
241
|
+
# 頻出パターンがなかった場合、lcm出力ファイルが生成されないので
|
242
|
+
# そのときのために空ファイルを生成しておいく。
|
243
|
+
system("touch #{lcmout}")
|
244
|
+
|
245
|
+
# lcm実行
|
246
|
+
minCnt=1
|
247
|
+
MCMD::msgLog("#{run} #{xxtra} #{minCnt} #{lcmout}")
|
248
|
+
TAKE::run_lcm("#{run} #{xxtra} #{minCnt} #{lcmout}")
|
249
|
+
#system("#{run} #{xxtra} #{minCnt} #{lcmout}")
|
250
|
+
#system "cp #{lcmout} lcmout"
|
251
|
+
|
252
|
+
xxp0=wf.file
|
253
|
+
xxt0=wf.file
|
254
|
+
|
255
|
+
TAKE::run_lcmtrans(lcmout,"p",xxt0)
|
256
|
+
|
257
|
+
f=""
|
258
|
+
#f << "#{TAKE::LcmIs::CMD_TRANS} #{lcmout} p |" # pattern,count,size,pid
|
259
|
+
f << "mdelnull f=pattern i=#{xxt0} |"
|
260
|
+
f << "mvreplace vf=pattern m=#{xxmap2} K=num2 f=node2 |"
|
261
|
+
f << "mcut f=pid,pattern,size:size2 |"
|
262
|
+
f << "mvsort vf=pattern |"
|
263
|
+
f << "msortf f=pid o=#{xxp0}"
|
264
|
+
system(f)
|
265
|
+
#system "cp #{xxp0} xxp0"
|
266
|
+
|
267
|
+
if byedge then
|
268
|
+
xx1=wf.file
|
269
|
+
xx2=wf.file
|
270
|
+
xx3=wf.file
|
271
|
+
|
272
|
+
system "mtra f=pattern i=#{xxp0} -r o=#{xx1}"
|
273
|
+
|
274
|
+
xx3t=wf.file
|
275
|
+
TAKE::run_lcmtrans(lcmout,"t",xx3t)
|
276
|
+
|
277
|
+
f=""
|
278
|
+
#f << "#{TAKE::LcmIs::CMD_TRANS} #{lcmout} t |" #__tid,pid
|
279
|
+
#f << "mcal c='${__tid}+1' a=_tid |"
|
280
|
+
f << "msortf f=__tid i=#{xx3t} |"
|
281
|
+
f << "mjoin k=__tid m=#{xxmap1} f=node1 K=num1 |"
|
282
|
+
f << "msortf f=pid o=#{xx2}"
|
283
|
+
system(f)
|
284
|
+
|
285
|
+
f=""
|
286
|
+
f << "mcount k=pid a=size1 i=#{xx2} |"
|
287
|
+
f << "mselnum f=size1 c='[#{minSize1},#{maxSize1}]' o=#{xx3}"
|
288
|
+
system(f)
|
289
|
+
|
290
|
+
f = ""
|
291
|
+
f << "mjoin k=pid m=#{xx3} f=size1 i=#{xx2} |"
|
292
|
+
f << "mnjoin k=pid m=#{xx1} f=pattern,size2 |"
|
293
|
+
f << "mcut f=pid:id,node1:#{ef1},pattern:#{ef2},size1,size2 o=#{oFile}"
|
294
|
+
system(f)
|
295
|
+
else
|
296
|
+
|
297
|
+
xx4t=wf.file
|
298
|
+
TAKE::run_lcmtrans(lcmout,"t",xx4t)
|
299
|
+
|
300
|
+
f=""
|
301
|
+
#f << "#{TAKE::LcmIs::CMD_TRANS} #{lcmout} t |" #__tid,pid
|
302
|
+
#f << "mcal c='${__tid}+1' a=_tid |"
|
303
|
+
f << "msortf f=__tid i=#{xx4t} |"
|
304
|
+
f << "mjoin k=__tid m=#{xxmap1} f=node1 K=num1 |"
|
305
|
+
f << "msortf f=pid |"
|
306
|
+
f << "mtra k=pid f=node1 |"
|
307
|
+
f << "mvcount vf=node1:size1 |"
|
308
|
+
f << "mjoin k=pid m=#{xxp0} f=pattern,size2 |"
|
309
|
+
f << "mselnum f=size1 c='[#{minSize1},#{maxSize1}]' |"
|
310
|
+
f << "mvsort vf=node1,pattern |"
|
311
|
+
f << "msortf f=node1,pattern |"
|
312
|
+
f << "mcut f=node1:#{ef1},pattern:#{ef2},size1,size2 o=#{oFile}"
|
313
|
+
system(f)
|
314
|
+
end
|
315
|
+
# 終了メッセージ
|
316
|
+
MCMD::endLog(args.cmdline)
|
317
|
+
|
data/bin/mbipolish.rb
ADDED
@@ -0,0 +1,362 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require "rubygems"
|
5
|
+
require "nysol/mcmd"
|
6
|
+
require "nysol/take"
|
7
|
+
require "set"
|
8
|
+
|
9
|
+
# ver="1.0" # 初期リリース 2015/09/27
|
10
|
+
# ver="1.1" # 2つ目の類似度と閾値の追加 2015/11/22
|
11
|
+
# ver="1.2" # logファイル出力追加 2016/06/25
|
12
|
+
# ver="1.3" # kn=を追加 2016/08/24
|
13
|
+
# ver="1.4" # kn2=を追加 2016/09/10
|
14
|
+
$cmd=$0.sub(/.*\//,"")
|
15
|
+
$version="1.4"
|
16
|
+
|
17
|
+
def help
|
18
|
+
STDERR.puts <<EOF
|
19
|
+
----------------------------
|
20
|
+
#{$cmd} version #{$version}
|
21
|
+
----------------------------
|
22
|
+
概要) 2部グラフの研磨をおこなう。
|
23
|
+
内容) 2部グラフを入力として、密度の高い2部部分グラフにあって枝が張られていないノードペアに枝を張る。
|
24
|
+
逆に、密度の低い2部部分グラフにあって枝が張られているノードペアの枝を刈る。
|
25
|
+
新たに張られる枝や刈られる枝の程度は、sim=,th=とsim2,th2で与えた値によって変わる。
|
26
|
+
書式) #{$cmd} ei= [ef=] [nf=] eo= [sim=i|I|s|S|T|R|P|C] th= [th2=] [sim2=i|I|s|S|T|R|P|C] [sup=] [iter=] [log=] [T=] [--help]
|
27
|
+
|
28
|
+
ファイル名指定
|
29
|
+
ei= : 枝データファイル
|
30
|
+
ef= : 枝データ上の2つの節点項目名(省略時は"node1,node2")
|
31
|
+
eo= : データ研磨後の枝データファイル
|
32
|
+
sim|2= : 節点a,bと接続された枝集合を、それぞれA,Bとすると、節点a,bに枝を張るために用いる類似度。
|
33
|
+
省略時はRが設定される。(sim2のデフォルト:sim=)
|
34
|
+
i: inclusion
|
35
|
+
I: both-inclusion
|
36
|
+
S: |A∩B|/max(|A|,|B|)
|
37
|
+
s: |A∩B|/min(|A|,|B|)
|
38
|
+
T (intersection): find pairs having common [threshld] items
|
39
|
+
R (resemblance): find pairs s.t. |A\capB|/|A\cupB| >= [threshld]
|
40
|
+
P (PMI): find pairs s.t. log (|A\capB|*|all| / (|A|*|B|)) >= [threshld]
|
41
|
+
C (cosine distance): find pairs s.t. inner product of their normalized vectors >= [threshld]
|
42
|
+
th|2= : sim|2=で指定された類似度について、ここで指定された値以上の節点間に枝を張る。(th2のデフォルト:th=)
|
43
|
+
sup= : 左の部の次数がsup以上のノードを対象とする。省略すればsup=0。
|
44
|
+
kn|2 = : kn=で指定された値以上の共起頻度を対象とする。kn2=で指定された値以上の次数を持つ右部を対象とする。
|
45
|
+
省略すればkn=1,kn2=1 [1以上の整数]
|
46
|
+
iter= : データ研磨の最大繰り返し数(デフォルト=30)
|
47
|
+
log= : ディレクトリ内にパラメータの設定値や収束回数等をkey-value形式のCSVで出力.繰り返し毎に生成される類似グループ出力
|
48
|
+
|
49
|
+
|
50
|
+
その他
|
51
|
+
T= : ワークディレクトリ(default:/tmp)
|
52
|
+
--help : ヘルプの表示
|
53
|
+
|
54
|
+
備考)
|
55
|
+
内部で起動しているコマンドsspcは0から始まる整数で指定された節点名を前提として処理する。
|
56
|
+
一方で本コマンドは、任意の文字列で節点名を表したデータを処理できる。
|
57
|
+
それは、sspcを実行する前に、それら文字列と整数との対応表を前処理で作成しているからである。
|
58
|
+
|
59
|
+
例) 2部グラフデータからのみグラフ研磨を実行する例
|
60
|
+
$ cat edge.csv
|
61
|
+
node1,node2
|
62
|
+
A,a
|
63
|
+
A,b
|
64
|
+
B,a
|
65
|
+
B,b
|
66
|
+
C,c
|
67
|
+
C,d
|
68
|
+
D,b
|
69
|
+
D,e
|
70
|
+
|
71
|
+
$ #{$cmd} ei=edge.csv ef=n1,n2 th=0.2 eo=output.csv
|
72
|
+
#MSG# converting the numbered nodes into original name ...; 2015/09/27 21:59:08
|
73
|
+
#END# #{$cmd} ei=edge.csv ef=n1,n2 th=0.2 eo=output.csv; 2015/09/27 21:59:08
|
74
|
+
$ cat output.csv
|
75
|
+
n1,n2
|
76
|
+
A,a
|
77
|
+
A,b
|
78
|
+
A,e
|
79
|
+
B,a
|
80
|
+
B,b
|
81
|
+
B,e
|
82
|
+
C,c
|
83
|
+
C,d
|
84
|
+
D,a
|
85
|
+
D,b
|
86
|
+
D,e
|
87
|
+
|
88
|
+
# Copyright(c) NYSOL 2012- All Rights Reserved.
|
89
|
+
EOF
|
90
|
+
exit
|
91
|
+
end
|
92
|
+
|
93
|
+
def ver()
|
94
|
+
STDERR.puts "version #{$version}"
|
95
|
+
exit
|
96
|
+
end
|
97
|
+
|
98
|
+
help() if ARGV.size <= 0 or ARGV[0]=="--help"
|
99
|
+
ver() if ARGV[0]=="--version"
|
100
|
+
|
101
|
+
args=MCMD::Margs.new(ARGV,"ei=,ef=,eo=,th=,sim=,th2=,sim2=,kn=,kn2=,sup=,iter=,log=","ei=,ef=,th=")
|
102
|
+
|
103
|
+
# コマンド実行可能確認
|
104
|
+
#CMD_sspc="sspc_20161209"
|
105
|
+
#CMD_grhfil="grhfil_20150920"
|
106
|
+
#exit(1) unless(MCMD::chkCmdExe(CMD_sspc , "executable"))
|
107
|
+
#exit(1) unless(MCMD::chkCmdExe(CMD_grhfil, "executable"))
|
108
|
+
|
109
|
+
# mcmdのメッセージは警告とエラーのみ
|
110
|
+
ENV["KG_VerboseLevel"]="2" unless args.bool("-mcmdenv")
|
111
|
+
|
112
|
+
#ワークファイルパス
|
113
|
+
if args.str("T=")!=nil then
|
114
|
+
ENV["KG_TmpPath"] = args.str("T=").sub(/\/$/,"")
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
ei = args. file("ei=","r") # edge file name
|
119
|
+
|
120
|
+
# ---- edge field names (two nodes) on ei=
|
121
|
+
$ef1,$ef2 = args.field("ef=", ei, "node1,node2",2,2)["names"]
|
122
|
+
|
123
|
+
measure = args.str("sim=","R") # similarity measure
|
124
|
+
measure2 = args.str("sim2=",measure) # similarity measure
|
125
|
+
minSupp = args.int("sup=",0) # minimam support
|
126
|
+
iterMax = args.int("iter=",30,1) # upper bound of iterations
|
127
|
+
th = args.float("th=") # threashold for similarity measure
|
128
|
+
th2 = args.float("th2=",th) # threashold for similarity measure
|
129
|
+
kn = args.float("kn=",1) # no. of interaction size more than threshold
|
130
|
+
kn2 = args.float("kn2=",1) # no. of right node size more than threshold
|
131
|
+
|
132
|
+
eo = args.file("eo=", "w")
|
133
|
+
logDir = args.file("log=", "w")
|
134
|
+
outDir = args.str("O=") # 過程出力
|
135
|
+
MCMD::mkDir(outDir) if outDir
|
136
|
+
MCMD::mkDir(logDir) if logDir
|
137
|
+
|
138
|
+
# node数とedge数をカウント
|
139
|
+
def calGsize(file)
|
140
|
+
nodes=Set.new
|
141
|
+
edgeSize=0
|
142
|
+
File.open(file,"r"){|fpr|
|
143
|
+
while line = fpr.gets
|
144
|
+
n1,n2 = line.split(" ")
|
145
|
+
nodes << n1
|
146
|
+
nodes << n2
|
147
|
+
edgeSize+=1
|
148
|
+
end
|
149
|
+
}
|
150
|
+
return nodes.size,edgeSize
|
151
|
+
end
|
152
|
+
|
153
|
+
def same?(file1,file2)
|
154
|
+
xx=MCMD::Mtemp.new.file
|
155
|
+
|
156
|
+
return false if File.size(file1)!=File.size(file2)
|
157
|
+
system "diff -q #{file1} #{file2} > #{xx}"
|
158
|
+
return false if File.size(xx)!=0
|
159
|
+
return true
|
160
|
+
end
|
161
|
+
|
162
|
+
def edge2mtx(ei,itra)
|
163
|
+
MCMD::msgLog("converting graph files into a pair of numbered nodes ...")
|
164
|
+
wf=MCMD::Mtemp.new
|
165
|
+
wf1=wf.file
|
166
|
+
wf2=wf.file
|
167
|
+
wf3=wf.file
|
168
|
+
|
169
|
+
|
170
|
+
system "mcut f=#{$ef1}:node i=#{ei} o=#{wf1}"
|
171
|
+
system "mcut f=#{$ef2}:node i=#{ei} o=#{wf2}"
|
172
|
+
|
173
|
+
# 各部ごとにマッピングテーブルを用意
|
174
|
+
system "mcut f=#{$ef1} i=#{ei} |muniq k=#{$ef1} |mdelnull f=#{$ef1} |mnumber -q a=num1 S=1 o=#{PART1}"
|
175
|
+
system "mcut f=#{$ef2} i=#{ei} |muniq k=#{$ef2} |mdelnull f=#{$ef2} |mnumber -q a=num2 S=1 o=#{PART2}"
|
176
|
+
|
177
|
+
f=""
|
178
|
+
f << "mcut f=#{$ef1},#{$ef2} i=#{ei} |"
|
179
|
+
f << "msortf f=#{$ef1} |"
|
180
|
+
f << "mjoin k=#{$ef1} m=#{PART1} f=num1 |"
|
181
|
+
f << "msortf f=#{$ef2} |"
|
182
|
+
f << "mjoin k=#{$ef2} m=#{PART2} f=num2 |"
|
183
|
+
f << "mcut f=num1,num2 |"
|
184
|
+
f << "mtra k=num1 f=num2 |"
|
185
|
+
f << "msortf f=num1%n |"
|
186
|
+
f << "mcut f=num2 -nfno |"
|
187
|
+
f << "tr ',' ' ' >#{itra}"
|
188
|
+
system(f)
|
189
|
+
|
190
|
+
end
|
191
|
+
|
192
|
+
def noPat
|
193
|
+
MCMD::msgLog("There is no frequent item. The value is too large")
|
194
|
+
exit
|
195
|
+
end
|
196
|
+
|
197
|
+
def convRsl(ifile,ofile,logDir=nil)
|
198
|
+
|
199
|
+
# 上記iterationで収束したマイクロクラスタグラフを元の節点文字列に直して出力する
|
200
|
+
MCMD::msgLog("converting the numbered nodes into original name ...")
|
201
|
+
f=""
|
202
|
+
f << "mcut -nfni f=0:tra <#{ifile} |"
|
203
|
+
f << "msed f=tra c=' $' v="" |"
|
204
|
+
f << "mnumber -q S=1 a=num1 |"
|
205
|
+
f << "mtra -r f=tra:num2 |"
|
206
|
+
f << "mjoin k=num2 m=#{PART2} f=#{$ef2} |"
|
207
|
+
f << "mjoin k=num1 m=#{PART1} f=#{$ef1} |"
|
208
|
+
f << "msortf f=num1%n,num2%n |"
|
209
|
+
f << "mcut f=#{$ef1},#{$ef2} |"
|
210
|
+
if logDir
|
211
|
+
f << "mfldname -q o=#{logDir}/#{ofile}"
|
212
|
+
else
|
213
|
+
f << "mfldname -q o=#{ofile}"
|
214
|
+
end
|
215
|
+
system(f)
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
def convSim(ifile,ofile,logDir)
|
220
|
+
|
221
|
+
f=""
|
222
|
+
f << "mcut -nfni f=0:tra <#{ifile} |"
|
223
|
+
f << "msed f=tra c=' $' v="" |"
|
224
|
+
f << "mnumber -q S=1 a=num0 |"
|
225
|
+
f << "mtra -r f=tra:num11 |"
|
226
|
+
f << "mnumber -q S=1 a=order |"
|
227
|
+
f << "mcal c='${num11}+1' a=num1 |"
|
228
|
+
f << "mjoin k=num1 m=#{PART1} f=#{$ef1} |"
|
229
|
+
f << "msortf f=order%n,num1%n |"
|
230
|
+
f << "mtra k=num0 s=order f=#{$ef1} |"
|
231
|
+
f << "mcut f=#{$ef1} o=#{logDir}/#{ofile}"
|
232
|
+
system(f)
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
# ============
|
237
|
+
# entry point
|
238
|
+
t=Time.now
|
239
|
+
|
240
|
+
# 入力ファイルをノード番号ペアデータ(input)に変換する。
|
241
|
+
# csvで指定された場合は、番号-アイテムmapデータも作成
|
242
|
+
wf=MCMD::Mtemp.new
|
243
|
+
xxinp=wf.file
|
244
|
+
PART1=wf.file # 数値と文字のマッピング用1
|
245
|
+
PART2=wf.file # 数値と文字のマッピング用1
|
246
|
+
|
247
|
+
edge2mtx(ei,xxinp)
|
248
|
+
input=xxinp
|
249
|
+
|
250
|
+
xxpair = wf.file # pair形式
|
251
|
+
xxtra = wf.file # tra形式
|
252
|
+
xxitra = wf.file # 処理入力のtra形式
|
253
|
+
xxdiff = wf.file # 差分ファイル
|
254
|
+
xxprev = wf.file # 前回のxxtra
|
255
|
+
xxsimgp= wf.file # 類似度グループの保存
|
256
|
+
|
257
|
+
nSizes=[]
|
258
|
+
eSizes=[]
|
259
|
+
denses=[]
|
260
|
+
|
261
|
+
#system "#{CMD_grhfil} D"" #{input} #{xxitra}"
|
262
|
+
TAKE::run_grhfil("D"" #{input} #{xxitra}")
|
263
|
+
puts "grhfil D"" #{input} #{xxitra}"
|
264
|
+
|
265
|
+
|
266
|
+
iter=0
|
267
|
+
while true
|
268
|
+
|
269
|
+
# 終了判定
|
270
|
+
break if iter>=iterMax
|
271
|
+
break if iter!=0 and same?(xxitra,xxprev)
|
272
|
+
|
273
|
+
MCMD::msgLog("polishing iteration ##{iter} (tra size=#{File.size(xxitra)}")
|
274
|
+
system "cp #{xxitra} #{xxprev}"
|
275
|
+
|
276
|
+
nodeSize,edgeSize=calGsize(xxitra)
|
277
|
+
edgeSize1 = edgeSize+1
|
278
|
+
|
279
|
+
#system "#{CMD_sspc} t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}"
|
280
|
+
TAKE::run_sspc("t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}")
|
281
|
+
puts "sspc t#{measure} -T #{kn} -l #{minSupp} -U 100000 -L 1 #{xxitra} #{th} #{xxpair}"
|
282
|
+
|
283
|
+
# 閾値が大きくてパターンが抽出されない場合は終了
|
284
|
+
noPat unless File.exist?("#{xxpair}")
|
285
|
+
noPat if File.size("#{xxpair}") == 0
|
286
|
+
|
287
|
+
# node pairをsspc入力形式に変換
|
288
|
+
# ./grhfil/grhfil eu0_ _TMP2_ _TMP3_
|
289
|
+
#system "#{CMD_grhfil} eu0 #{xxpair} #{xxtra}"
|
290
|
+
TAKE::run_grhfil("eu0 #{xxpair} #{xxtra}")
|
291
|
+
puts "grhfil eu0 #{xxpair} #{xxtra}"
|
292
|
+
|
293
|
+
convSim("#{xxtra}","simGp#{iter}.csv",logDir) if logDir
|
294
|
+
|
295
|
+
# 入力と類似行列を連結
|
296
|
+
system "cat #{xxitra} #{xxtra} > #{xxpair}"
|
297
|
+
|
298
|
+
# 入力ファイルと、比較ファイルを比較 => 新しいトランザクションDBの完成
|
299
|
+
#system "#{CMD_sspc} #{measure2} -T #{kn2} -c #{edgeSize} #{xxpair} #{th2} #{xxtra}"
|
300
|
+
TAKE::run_sspc("#{measure2} -T #{kn2} -c #{edgeSize} #{xxpair} #{th2} #{xxtra}")
|
301
|
+
puts "sspc #{measure2} -T #{kn2} -c #{edgeSize} #{xxpair} #{th2} #{xxtra}"
|
302
|
+
|
303
|
+
|
304
|
+
# 閾値が大きくてパターンが抽出されない場合は終了
|
305
|
+
noPat unless File.exist?("#{xxtra}")
|
306
|
+
noPat if File.size("#{xxtra}") == 0
|
307
|
+
|
308
|
+
# 行列形式に変換
|
309
|
+
#system "#{CMD_grhfil} ed #{xxtra} #{xxpair}"
|
310
|
+
TAKE::run_grhfil("ed #{xxtra} #{xxpair}")
|
311
|
+
puts "grhfil ed #{xxtra} #{xxpair}"
|
312
|
+
|
313
|
+
# catした入力ファイルを削除"
|
314
|
+
system "tail -n +#{edgeSize1} #{xxpair} >#{xxtra}"
|
315
|
+
#system "#{CMD_grhfil} D #{xxtra} #{xxpair}"
|
316
|
+
TAKE::run_grhfil("D #{xxtra} #{xxpair}")
|
317
|
+
puts "grhfil D #{xxtra} #{xxpair}"
|
318
|
+
|
319
|
+
x="$d2/grhfil dE -d _TMP_ _TMP8_ _TMP9_" # 差分計算
|
320
|
+
#system "#{CMD_grhfil} dE -d #{xxitra} #{xxpair} #{xxdiff}"
|
321
|
+
TAKE::run_grhfil("dE -d #{xxitra} #{xxpair} #{xxdiff}")
|
322
|
+
puts "grhfil dE -d #{xxitra} #{xxpair} #{xxdiff}"
|
323
|
+
|
324
|
+
|
325
|
+
system "cp #{xxpair} #{xxitra}"
|
326
|
+
if logDir
|
327
|
+
#system "#{CMD_grhfil} D #{xxitra} #{xxpair}"
|
328
|
+
TAKE::run_grhfil("D #{xxitra} #{xxpair}")
|
329
|
+
puts "grhfil D #{xxitra} #{xxpair}"
|
330
|
+
convRsl(xxpair,"iter#{iter}.csv",logDir) if logDir
|
331
|
+
end
|
332
|
+
iter+=1
|
333
|
+
|
334
|
+
end
|
335
|
+
|
336
|
+
#system "#{CMD_grhfil} D #{xxitra} #{xxpair}"
|
337
|
+
TAKE::run_grhfil("D #{xxitra} #{xxpair}")
|
338
|
+
puts "grhfil D #{xxitra} #{xxpair}"
|
339
|
+
convRsl("#{xxpair}",eo)
|
340
|
+
|
341
|
+
|
342
|
+
procTime=Time.now-t
|
343
|
+
|
344
|
+
# ログファイル出力
|
345
|
+
if logDir
|
346
|
+
kv=args.getKeyValue()
|
347
|
+
kv << ["iter",iter]
|
348
|
+
kv << ["time",procTime]
|
349
|
+
(0...nSizes.size).each{|i|
|
350
|
+
kv << ["nSize#{i}",nSizes[i]]
|
351
|
+
kv << ["eSize#{i}",eSizes[i]]
|
352
|
+
kv << ["dens#{i}" ,denses[i]]
|
353
|
+
}
|
354
|
+
MCMD::Mcsvout.new("o=#{logDir}/keyVal.csv f=key,value"){|csv|
|
355
|
+
kv.each{|line|
|
356
|
+
csv.write(line)
|
357
|
+
}
|
358
|
+
}
|
359
|
+
end
|
360
|
+
|
361
|
+
# 終了メッセージ
|
362
|
+
MCMD::endLog(args.cmdline)
|